Demo.vue 2.8 KB

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