Demo.vue 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. <template>
  2. <div>
  3. <section class="todoapp">
  4. <TodoHeader v-bind:addTask="addTodo"></TodoHeader>
  5. <TodoContent
  6. :todoList="renderList()"
  7. :choose="handleChoose"
  8. :remove="handleDelete"
  9. :all="handleAll"
  10. ></TodoContent>
  11. <TodoFooter
  12. :count="countSelected()"
  13. :selectedMain="handleSelect"
  14. :newFilter="filters"
  15. :removeComplete="handleRemove"
  16. ></TodoFooter>
  17. </section>
  18. </div>
  19. </template>
  20. <script lang="ts" setup>
  21. import { ref, reactive } from "vue";
  22. import TodoHeader from "./components/TodoHeader.vue";
  23. import TodoFooter from "./components/TodoFooter.vue";
  24. import TodoContent from "./components/TodoContent.vue";
  25. // 添加方法
  26. const addTodo = (val: string) => {
  27. let obj = {
  28. id: Date.now(),
  29. text: val,
  30. completed: false,
  31. };
  32. todoList.value.push(obj);
  33. };
  34. export interface Todo {
  35. id: number;
  36. text: string;
  37. completed: boolean;
  38. }
  39. // 数组
  40. const todoList = ref<Todo[]>([
  41. {
  42. id: 1,
  43. text: "吃饭",
  44. completed: false,
  45. },
  46. {
  47. id: 2,
  48. text: "睡觉",
  49. completed: true,
  50. },
  51. ]);
  52. // 过滤
  53. const filters = ref("all");
  54. // 未选中的数量
  55. function countSelected() {
  56. return todoList.value.filter((item) => !item.completed).length;
  57. }
  58. // 选中
  59. function handleChoose(val: number) {
  60. for (var i = 0; i < todoList.value.length; i++) {
  61. if (todoList.value[i].id == val) {
  62. todoList.value[i].completed = !todoList.value[i].completed;
  63. }
  64. }
  65. }
  66. // 渲染数组
  67. const renderList = () => {
  68. if (filters.value == "all") return todoList.value;
  69. // if(filters.value == 'avtive') {
  70. // return todoList.value.filter((item) => !item.completed)
  71. // }
  72. // if(filters.value == 'completed') {
  73. // return todoList.value.filter((item) => item.completed)
  74. // }
  75. return todoList.value.filter((item) =>
  76. filters.value === "active" ? !item.completed : item.completed
  77. );
  78. };
  79. // 修改filters的值
  80. const handleSelect = (val: string) => {
  81. filters.value = val;
  82. };
  83. // 删除单条数据
  84. const handleDelete = (val:number) => {
  85. console.log("删除",val)
  86. if(!window.confirm("确定删除该条信息么?")) return;
  87. todoList.value = todoList.value.filter((item)=>item.id != val);
  88. }
  89. // 删除所有完成项
  90. const handleRemove=() => {
  91. if(!window.confirm("确定删除所有完成项目么?")) return;
  92. todoList.value = todoList.value.filter((item)=> !item.completed );
  93. }
  94. // 全选
  95. function handleAll(val:any) {
  96. console.log("全选",val.checked)
  97. todoList.value.map((item) => {
  98. return item.completed = val.checked
  99. })
  100. }
  101. </script>
  102. <!-- npm install sass -->
  103. <style lang="scss" scoped>
  104. </style>