App.vue 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. <template>
  2. <div id="root">
  3. <div class="todo-container">
  4. <div class="todo-wrap">
  5. <MyHeader @addTodo="addTodo"></MyHeader>
  6. <MyList :todos="todos"></MyList>
  7. <MyFooter :todos="todos" @checkAllTodo="checkAllTodo" @cleatAllTodo="cleatAllTodo"></MyFooter>
  8. </div>
  9. </div>
  10. </div>
  11. </template>
  12. <script>
  13. import MyHeader from "./components/MyHeader.vue";
  14. import MyList from "./components/MyList.vue";
  15. import MyFooter from "./components/MyFooter.vue";
  16. export default {
  17. name: "App",
  18. components: { MyHeader, MyList, MyFooter },
  19. data() {
  20. return {
  21. todos: JSON.parse(localStorage.getItem('todos')) || []
  22. };
  23. },
  24. methods:{
  25. //添加一个todo
  26. addTodo(todoObj){
  27. // console.log('我是App组件,我收到了数据:',todoObj)
  28. this.todos.unshift(todoObj)
  29. },
  30. //勾选或取消勾选一个todo
  31. checkTodo(id){
  32. this.todos.forEach((todo) => {
  33. if(todo.id === id) todo.done = !todo.done
  34. })
  35. },
  36. //删除一个todo
  37. deleteTodo(id){
  38. // const todos = this.todos.filter((todo) => {
  39. // return todo.id !== id
  40. // })
  41. //简化写法
  42. this.todos = this.todos.filter(todo => todo.id !== id)
  43. },
  44. //全选或取消全选
  45. checkAllTodo(done){
  46. this.todos.forEach((todo) => {
  47. todo.done = done
  48. })
  49. },
  50. //清除已经完成的todo
  51. cleatAllTodo(){
  52. this.todos = this.todos.filter((todo) => {
  53. return !todo.done
  54. })
  55. }
  56. },
  57. // 实现本地存储
  58. watch:{
  59. todos:{
  60. deep:true,
  61. handler(value){
  62. localStorage.setItem('todos',JSON.stringify(value))
  63. }
  64. }
  65. },
  66. mounted(){
  67. this.$bus.$on('checkTodo',this.checkTodo)
  68. this.$bus.$on('deleteTodo',this.deleteTodo)
  69. },
  70. beforeDestroy(){
  71. this.$bus.$off('checkTodo')
  72. this.$bus.$off('deleteTodo')
  73. }
  74. };
  75. </script>
  76. <style scoped>
  77. /*base*/
  78. body {
  79. background: #fff;
  80. }
  81. .btn {
  82. display: inline-block;
  83. padding: 4px 12px;
  84. margin-bottom: 0;
  85. font-size: 14px;
  86. line-height: 20px;
  87. text-align: center;
  88. vertical-align: middle;
  89. cursor: pointer;
  90. box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2),
  91. 0 1px 2px rgba(0, 0, 0, 0.05);
  92. border-radius: 4px;
  93. }
  94. .btn-danger {
  95. color: #fff;
  96. background-color: #da4f49;
  97. border: 1px solid #bd362f;
  98. }
  99. .btn-danger:hover {
  100. color: #fff;
  101. background-color: #bd362f;
  102. }
  103. .btn:focus {
  104. outline: none;
  105. }
  106. .todo-container {
  107. width: 600px;
  108. margin: 0 auto;
  109. }
  110. .todo-container .todo-wrap {
  111. padding: 10px;
  112. border: 1px solid #ddd;
  113. border-radius: 5px;
  114. }
  115. </style>