App.vue 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  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" :checkTodo="checkTodo" :deleteTodo="deleteTodo"></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. };
  67. </script>
  68. <style scoped>
  69. /*base*/
  70. body {
  71. background: #fff;
  72. }
  73. .btn {
  74. display: inline-block;
  75. padding: 4px 12px;
  76. margin-bottom: 0;
  77. font-size: 14px;
  78. line-height: 20px;
  79. text-align: center;
  80. vertical-align: middle;
  81. cursor: pointer;
  82. box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2),
  83. 0 1px 2px rgba(0, 0, 0, 0.05);
  84. border-radius: 4px;
  85. }
  86. .btn-danger {
  87. color: #fff;
  88. background-color: #da4f49;
  89. border: 1px solid #bd362f;
  90. }
  91. .btn-danger:hover {
  92. color: #fff;
  93. background-color: #bd362f;
  94. }
  95. .btn:focus {
  96. outline: none;
  97. }
  98. .todo-container {
  99. width: 600px;
  100. margin: 0 auto;
  101. }
  102. .todo-container .todo-wrap {
  103. padding: 10px;
  104. border: 1px solid #ddd;
  105. border-radius: 5px;
  106. }
  107. </style>