1
0

Todo.vue 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. <template>
  2. <li class="todo" :class="{ completed: todo.done, editing: editing }">
  3. <div class="view">
  4. <input class="toggle"
  5. type="checkbox"
  6. :checked="todo.done"
  7. @change="toggleTodo(todo)">
  8. <label v-text="todo.text" @dblclick="editing = true"></label>
  9. <button class="destroy" @click="deleteTodo(todo)"></button>
  10. </div>
  11. <input class="edit"
  12. v-show="editing"
  13. v-focus="editing"
  14. :value="todo.text"
  15. @keyup.enter="doneEdit"
  16. @keyup.esc="cancelEdit"
  17. @blur="doneEdit">
  18. </li>
  19. </template>
  20. <script>
  21. export default {
  22. props: ['todo'],
  23. data () {
  24. return {
  25. editing: false
  26. }
  27. },
  28. directives: {
  29. focus (value) {
  30. if (value) {
  31. this.vm.$nextTick(() => {
  32. this.el.focus()
  33. })
  34. }
  35. }
  36. },
  37. methods: {
  38. toggleTodo (todo) {
  39. this.$store.actions.toggleTodo(todo)
  40. },
  41. deleteTodo (todo) {
  42. this.$store.actions.deleteTodo(todo)
  43. },
  44. doneEdit (e) {
  45. const value = e.target.value.trim()
  46. if (!value) {
  47. this.deleteTodo(this.todo)
  48. } else if (this.editing) {
  49. this.editTodo(this.todo, value)
  50. this.editing = false
  51. }
  52. },
  53. cancelEdit (e) {
  54. e.target.value = this.todo.text
  55. this.editing = false
  56. }
  57. }
  58. }
  59. </script>