프로젝트 생성
- npx @vue/cli create vue-todo
- npm run serve
초기세팅
<template>
<div id="app">
</div>
</template>
<script>
export default {};
</script>
- bootstrap 연결
- public 폴더 안에 index.html 에서 head 태그안에 연결
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous">
App.vue
<template>
<div id="app" class="container">
<h1 class="text-center">Todo App</h1>
<input
v-model="todoText"
type="text"
class="w-100 p-2"
placeholder="Type todo"
@keyup.enter="addTodo"
/>
<hr />
<Todo
v-for="todo in todos"
:key="todo.id"
:todo="todo"
@toggle-checkbox="toggleCheckbox"
@click-delete="deleteTodo"
/>
</div>
</template>
<script>
import Todo from "@/components/Todo.vue";
export default {
components: {
Todo,
},
data() {
return {
todoText: "",
todos: [
{ id: 1, text: "buy a car", checked: false },
{ id: 2, text: "play game", checked: false },
],
};
},
methods: {
deleteTodo(id) {
this.todos = this.todos.filter((todo) => todo.id !== id);
},
addTodo(e) {
this.todos.push({
id: Math.random(),
text: e.target.value,
checked: false,
});
this.todoText = "";
},
toggleCheckbox({ id, checked }) {
const index = this.todos.findIndex((todo) => {
return todo.id === id;
});
this.todos[index].checked = checked;
},
},
};
</script>
Todo.vue
<template>
<div class="mb-2 d-flex">
<div>
<input type="checkbox" :checked="todo.checked" @change="toggleCheckbox" />
</div>
<span
class="ml-3 flex-grow-1"
:class="todo.checked ? 'text-muted' : ''"
:style="todo.checked ? 'text-decoration: line-through' : ''"
>{{ todo.text }}</span>
<button class="btn btn-danger btn-sm" @click="clickDelete">Delete</button>
</div>
</template>
<script>
export default {
props: {
todo: {
type: Object,
required: true,
},
},
methods: {
toggleCheckbox(e) {
this.$emit("toggle-checkbox", {
id: this.todo.id,
checked: e.target.checked,
});
},
clickDelete() {
this.$emit("click-delete", this.todo.id);
},
},
};
</script>
<style>
</style>