1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
| <template>
| <li :class="{ completed: todo.done, editing: editing }" class="todo">
| <div class="view">
| <input
| :checked="todo.done"
| class="toggle"
| type="checkbox"
| @change="toggleTodo( todo)">
| <label @dblclick="editing = true" v-text="todo.text"/>
| <button class="destroy" @click="deleteTodo( todo )"/>
| </div>
| <input
| v-focus="editing"
| v-show="editing"
| :value="todo.text"
| class="edit"
| @keyup.enter="doneEdit"
| @keyup.esc="cancelEdit"
| @blur="doneEdit">
| </li>
| </template>
|
| <script>
| export default {
| name: "Todo",
| directives: {
| focus(el, { value }, { context }) {
| if (value) {
| context.$nextTick(() => {
| el.focus();
| });
| }
| }
| },
| props: {
| todo: {
| type: Object,
| default: function() {
| return {};
| }
| }
| },
| data() {
| return {
| editing: false
| };
| },
| methods: {
| deleteTodo(todo) {
| this.$emit("deleteTodo", todo);
| },
| editTodo({ todo, value }) {
| this.$emit("editTodo", { todo, value });
| },
| toggleTodo(todo) {
| this.$emit("toggleTodo", todo);
| },
| doneEdit(e) {
| const value = e.target.value.trim();
| const { todo } = this;
| if (!value) {
| this.deleteTodo({
| todo
| });
| } else if (this.editing) {
| this.editTodo({
| todo,
| value
| });
| this.editing = false;
| }
| },
| cancelEdit(e) {
| e.target.value = this.todo.text;
| this.editing = false;
| }
| }
| };
| </script>
|
|