반응형
Vue만 해당하는 것이 아니라 자바스크립트라고 할 수 있는데요. 기존에 작성하던 코드에서 이어서 진행하겠습니다.
삭제 버튼을 하나 생성 합니다. 반복문 안에서 넣어주세요. 버튼은 반복하는 개벌 항복바다 삭제 버튼이 있어야 하니까 v-for 안에 있어야 합니다. 몇 번째 있는 항목인지 넘겨주기 위해서 index도 같이 같이 가져올 수 있어요.
<div
v-for="(todo, index) in todos"
:key="todo.id"
class="card mt-10"
>
v-for에서 반복하는 Index를 버튼을 만들 때 넘겨요.
<button class="btn btn-danger btn-sm" @click="deleteTodo(index)">삭제</button>
deleteTodo 함수가 필요해요. 만든 deleteTodo를 return에 넣어야 합니다. splice는 배열에서 몇 번째 인자에 있는 항목부터 두 번째 있는 항목만큼 잘라내기 해서 반환합니다. 삭제에도 사용할 수 있습니다.
const deleteTodo = (index) => {
todos.value.splice(index,1)
}
아래는 전체 코드입니다.
<template>
<div class="container">
<h2>TO DO</h2>
<form
@submit.prevent="onAdd"
class="d-flex"
>
<div class="flex-grow-1 mr-1">
<input
class="form-control"
type="text"
v-model="todo"
placeholder="할일을 입력하세요."
/>
</div>
<div>
<button
class="btn btn-primary"
type="submit"
>
추가
</button>
</div>
</form>
<div v-show="errorMessage!==''" class="card mt-10">
<div class="card-body p-2">
{{ errorMessage }}
</div>
</div>
<div
v-for="(todo, index) in todos"
:key="todo.id"
class="card mt-10"
>
<div class="card-body p-2 d-flex align-items-center">
<div class="form-check flex-grow-1">
<input class="form-check-input" type="checkbox" v-model="todo.completed"/>
<label class="form-check-label" :class="{ todo: todo.completed }">
{{ todo.subject }}
</label>
</div>
<div>
<button class="btn btn-danger btn-sm" @click="deleteTodo(index)">삭제</button>
</div>
</div>
</div>
</div>
</template>
<script>
import { ref } from 'vue'
export default {
setup() {
const todo = ref("")
const todos = ref([])
const errorMessage = ref("")
const todoCompletedStyle = {
textDecoration: 'line-through',
color: 'gray'
}
const onAdd = () => {
if(todo.value === ''){
errorMessage.value = "아무것도 입력하지 않았습니다."
} else {
todos.value.push({
id: Date.now(),
completed: false,
subject: todo.value
})
todo.value = ""
errorMessage.value = ""
}
}
const deleteTodo = (index) => {
todos.value.splice(index,1)
}
return {
todo,
todos,
errorMessage,
todoCompletedStyle,
onAdd,
deleteTodo
}
}
}
</script>
<style scoped>
.todo {
text-decoration: line-through;
color: gray;
}
</style>
반응형
'코딩 프로그래밍 > Javascript 자바스크립트' 카테고리의 다른 글
meta viewport 자바스크립트 다루기 (0) | 2023.05.19 |
---|---|
Vue 파일 분리할 때 필요한 emit (0) | 2023.04.04 |
Vue style 동적 바인딩 할당 (0) | 2023.04.03 |
Vue 배열 이용한 체크박스 바인딩 (0) | 2023.04.03 |
Vue v-show 적용 (0) | 2023.04.03 |
댓글