App.vue 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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是MyHeader组件和MyFooter组件都在使用,所以放在App中(状态提升)
  22. todos: [
  23. { id: "001", title: "抽烟", done: true },
  24. { id: "002", title: "喝酒", done: false },
  25. { id: "003", title: "开车", done: true },
  26. ],
  27. };
  28. },
  29. methods:{
  30. //添加一个todo
  31. addTodo(todoObj){
  32. // console.log('我是App组件,我收到了数据:',todoObj)
  33. this.todos.unshift(todoObj)
  34. },
  35. //勾选或取消勾选一个todo
  36. checkTodo(id){
  37. this.todos.forEach((todo) => {
  38. if(todo.id === id) todo.done = !todo.done
  39. })
  40. },
  41. //删除一个todo
  42. deleteTodo(id){
  43. // const todos = this.todos.filter((todo) => {
  44. // return todo.id !== id
  45. // })
  46. //简化写法
  47. this.todos = this.todos.filter(todo => todo.id !== id)
  48. },
  49. //全选或取消全选
  50. checkAllTodo(done){
  51. this.todos.forEach((todo) => {
  52. todo.done = done
  53. })
  54. },
  55. //清除已经完成的todo
  56. cleatAllTodo(){
  57. this.todos = this.todos.filter((todo) => {
  58. return !todo.done
  59. })
  60. }
  61. }
  62. };
  63. </script>
  64. <style scoped>
  65. /*base*/
  66. body {
  67. background: #fff;
  68. }
  69. .btn {
  70. display: inline-block;
  71. padding: 4px 12px;
  72. margin-bottom: 0;
  73. font-size: 14px;
  74. line-height: 20px;
  75. text-align: center;
  76. vertical-align: middle;
  77. cursor: pointer;
  78. box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2),
  79. 0 1px 2px rgba(0, 0, 0, 0.05);
  80. border-radius: 4px;
  81. }
  82. .btn-danger {
  83. color: #fff;
  84. background-color: #da4f49;
  85. border: 1px solid #bd362f;
  86. }
  87. .btn-danger:hover {
  88. color: #fff;
  89. background-color: #bd362f;
  90. }
  91. .btn:focus {
  92. outline: none;
  93. }
  94. .todo-container {
  95. width: 600px;
  96. margin: 0 auto;
  97. }
  98. .todo-container .todo-wrap {
  99. padding: 10px;
  100. border: 1px solid #ddd;
  101. border-radius: 5px;
  102. }
  103. </style>