Todo.vue 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  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. import {
  22. toggleTodo,
  23. deleteTodo,
  24. editTodo
  25. } from '../vuex/actions'
  26. export default {
  27. props: ['todo'],
  28. vuex: {
  29. actions: {
  30. toggleTodo,
  31. deleteTodo,
  32. editTodo
  33. }
  34. },
  35. data () {
  36. return {
  37. editing: false
  38. }
  39. },
  40. directives: {
  41. focus (value) {
  42. if (value) {
  43. this.vm.$nextTick(() => {
  44. this.el.focus()
  45. })
  46. }
  47. }
  48. },
  49. methods: {
  50. doneEdit (e) {
  51. const value = e.target.value.trim()
  52. if (!value) {
  53. this.deleteTodo(this.todo)
  54. } else if (this.editing) {
  55. this.editTodo(this.todo, value)
  56. this.editing = false
  57. }
  58. },
  59. cancelEdit (e) {
  60. e.target.value = this.todo.text
  61. this.editing = false
  62. }
  63. }
  64. }
  65. </script>