vue3-03筛选任务

news2025/2/22 13:33:11

前置知识:生命周期函数在vue3不再是配置式的,而是一个普通函数。
步骤:

  1. 确认筛选条件是通过hash值
  2. 声明filter函数:通过hash改变的筛选得到对应的任务列表
  3. userFilter.js文件:用于任务的筛选。
    1. 使用一个响应式变量visibilityRef 来取得筛选条件hash
    2. 使用声明周期函数onMounted,监听hash的变化
    3. 使用声明周期函数onUnmounted,销毁hash的监听
    4. 明确筛选后的任务列表,是需要通过初始的任务列表todosRef和筛选条件visibilityRef 来计算得到的。而todosRef在另外一个js,因此需要在App.vue文件中传递过来。
    5. 根据页面需要展示的信息来计算出对应的内容。在这里插入图片描述
filter函数
/**
 * 任务筛选
 * @param {*} todos 任务列表
 * @param {*} visibility 筛选条件
 */
export function filter(todos,visibility = 'all') {
    if(visibility === 'all'){
        return todos;
    }
    else if (visibility === 'active'){
        return todos.filter((it) => !it.completed);
    }
    else if(visibility === 'completed') {
        console.log(todos.filter((it) => it.completed),'todos.filter((it) => it.completed)')
        return todos.filter((it) => it.completed);
    }
    throw new Error ("invalid visibility value");
}
userFilter.js
// 生命周期函数在vue3不再是配置式的,而是一个普通函数
import {
    computed,
    onMounted,
    onUnmounted,
    ref
} from "vue";
import {
    filter
} from "../util/todoStorage";

const validHash = ['all', 'active', 'completed']
export default function useFilter(todosRef) {
    const visibilityRef = ref("all") // 筛选条件

    // 根据哈希值取得筛选条件
    const onHashChange = () => {
        // 通过调用 replace(/#\/?/, ""),我们使用正则表达式将 # 或 #/ 替换为空字符串,从而得到去除 # 或 #/ 的结果。
        const hash = location.hash.replace(/#\/?/, "");
        if (validHash.includes(hash)) {
            // 存在的
            visibilityRef.value = hash;
        } else {
            location.hash = '';
            visibilityRef.value = 'all';
        }
    }

    // 1. 组件挂载完成的生命周期函数
    onMounted(() => {
        // hashchange: 此方法是用于监听hash的变化
        return window.addEventListener('hashchange', onHashChange);
    });
    // 2. 组件销毁过后的生命周期函数
    onUnmounted(() => {
        window.removeEventListener("hashchange", onHashChange);
    });

    // 根据筛选条件去筛选列表任务,进而计算出应该展示的任务列表
    const filteredTodosRef = computed(() => {
        return filter(todosRef.value, visibilityRef.value);
    })

    // 计算出未完成的数量:用于页面左下角的待完成的数量
    const remainingRef = computed(() => {
        return filter(todosRef.value, 'active').length;
    })

    // 计算已完成的数量:用于页面判断是否展示右下角的 Clear completed按钮
    const completedRef = computed(() => {
        return filter(todosRef.value, 'completed').length;
    })

    return {
        visibilityRef,
        filteredTodosRef,
        remainingRef,
        completedRef
    }
}
App.vue
<template>
  <link rel="stylesheet" href="./style.css" />
  <div id="app">
    <section class="todoapp">
      <header class="header">
        <h1>todos</h1>
        <input class="new-todo" autofocus="" autocomplete="off" placeholder="What needs to be done?" v-model="newTodoRef"
          @keyup.enter="addTodo" />
      </header>
      <section class="main">
        <input id="toggle-all" class="toggle-all" type="checkbox"/>
        <label for="toggle-all">Mark all as complete</label>
        <ul class="todo-list">
          <li class="todo" v-for="todo in filteredTodosRef" :key="todo.id" :class="{completed:todo.completed}">
            <div class="view">
              <input class="toggle" type="checkbox" v-model="todo.completed" />
              <label>{{todo.title}}</label>
              <button class="destroy"></button>
            </div>
            <input class="edit" type="text" />
          </li>
        </ul>
      </section>
      <footer class="footer">
        <span class="todo-count">
          <strong>{{remainingRef}}</strong>
          <span>item{{remainingRef === 1 ?'' : 's'}} left</span>
        </span>
        <ul class="filters">
          <li><a href="#/all" :class="{selected: visibilityRef === 'all'}">All</a></li>
          <li><a href="#/active" :class="{selected: visibilityRef === 'active'}">Active</a></li>
          <li><a href="#/completed" :class="{selected: visibilityRef === 'completed'}">Completed</a></li>
        </ul>
        <button class="clear-completed" v-show="completedRef">
          Clear completed
        </button>
      </footer>
    </section>
  </div>
</template>

<script>
import useTodoList from "./composition/useTodoList"
import useNewTodo from "./composition/useNewTodo"
import useFilter from "./composition/useFilter";
export default {
  setup() {
    const { todosRef } = useTodoList();
    return {
      todosRef,
      ...useNewTodo(todosRef),
      ...useFilter(todosRef)
    }
  }
}
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/760034.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

copy和xcopy实现复制文件和文件目录

copy命令复制文件 语法 copy [/d] [/v] [/n] [/y | /-y] [/z] [/a | /b] <source> [/a | /b] [<source> [/a | /b] [ ...]] [<destination> [/a | /b]]参数说明 参数说明/d允许加密的源文件保存为解密的目标文件/v验证目标文件是否正确写入/n如果需要&…

kubesphere的CICD

安装 SonarQube 服务器 请先安装 Helm&#xff0c;以便后续使用该工具安装 SonarQube。例如&#xff0c;运行以下命令安装 Helm 3&#xff1a; curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash查看 Helm 版本 helm versionversion.Buil…

3D渲染速度慢,花重金买显卡还是用云渲染更划算

3D渲染对建筑师和设计师来说并不陌生&#xff0c;3D渲染的过程中出现渲染卡顿、特殊材质难以渲染&#xff0c;或者本地配置不足、本地渲染资源不够时&#xff0c;常常会影响工作效率。本文比较了3D渲染时&#xff0c;为提高工作效率&#xff0c;买显卡还是用云渲染更划算&#…

SystemVerilog 教程第二章数据类型:队列

SystemVerilog 队列 SystemVerilog queue&#xff08;队列&#xff09;是一种 First In First Out&#xff08;先入先出&#xff09;方案&#xff0c;您可为其设置变量大小&#xff0c;用于存储相同数据类型的各种元素。 它与一维解包阵列类似&#xff0c;同样可以自动伸缩调整…

zabbix 6.0 监控LNPM环境

这里的LNPM是指Linux&#xff0c;Nginx,php-fpm和Mysql.具体版本如下。 Linux : centos7.9Nginx: 1.22.1php-fpm:7.4Mysql: 8.0 一、centos7.9 编译安装Nginx 为了弄清楚Nginx各种配置&#xff0c;我们采用编译安装的形式部署Nginx。 1.下载安装包 首先下载Nginx软件包&am…

unity 调用C++ dll 有类和指针操作

这个在之前unity 调用C dll 操作升级套娃函数调用_天人合一peng的博客-CSDN博客的基础上&#xff0c;但实事时类相互嵌套&#xff0c;非常不好处理。 1 测试直接将main()生成dll程序能运行不。 发现是可以的。 2 那就是想方法把对象或指针的操作的下一级函数直接写到main里面&…

简单认识数据库用户管理

文章目录 一、数据库用户管理1、新建用户&#xff08;1&#xff09;创建用户使用明文设置密码&#xff08;2&#xff09;获取密文再给新用户设置密码&#xff08;3&#xff09;查看数据库用户和其他信息&#xff08;4&#xff09;查看当前登录用户信息 2.修改数据库用户相关信息…

漏洞复现-CVE-2023-33246 Apache RocketMQ RCE漏洞原理与复现

目录 漏洞原理漏洞描述影响范围 Apache RocketMQ学习文档学习代码审计 漏洞复现docker环境搭建exp代码 总结参考 漏洞原理 漏洞描述 For RocketMQ versions 5.1.0 and below, under certain conditions, there is a risk of remote command execution. Several components of…

Wine的调试方法

wine的运行管理 # 运行exe程序 wine <exe程序># 运行msi程序 wine msiexec /i <msi程序> wine start <msi程序># 静默安装 wine <exe程序> /q /doNotRequireDRMPrompt /noupdate# 杀掉wine进程 wineserver -k pkill wine配置wine 配置环境变量 # 配…

GD32f103系列外部晶振更改

GD32f103系列的芯片现在基本很普通了&#xff0c;外部很多资料都是使用8MHz晶振为CPU提供主频。很多的时候由于项目的原因&#xff0c;外部晶振会更换不同的频率&#xff0c;有4MHz或者12Mhz的&#xff0c;因此需要在系统文件中做一些更改。 以8MHz晶振转12MHz晶振为例&#x…

Redis(三)存储原理与数据模型(hash冲突、渐进式rehash)

Redis系列文章 Redis&#xff08;一&#xff09;原理及基本命令&#xff08;柔性数组&#xff09; Redis&#xff08;二&#xff09;网络协议和异步方式&#xff08;乐观锁&悲观锁&#xff09; Redis&#xff08;三&#xff09;存储原理与数据模型&#xff08;hash冲突、渐…

chatGPT指令大全可免费使用网站列表chatGPT4试用方案

指令列表 写作助理 &#x1f449; 最常使用的 prompt&#xff0c;用于优化文本的语法、清晰度和简洁度&#xff0c;提高可读性。作为一名中文写作改进助理&#xff0c;你的任务是改进所提供文本的拼写、语法、清晰、简洁和整体可读性&#xff0c;同时分解长句&#xff0c;减少…

【CesiumJS入门】(7)绘制多段线(动态实时画线)

前言 鼠标左键添加点、右键完成绘制,单击右侧弹窗关闭按钮清空绘制。参考沙盒示例&#xff1a;Drawing on Terrain 直接上代码了 /** Date: 2023-07-12 18:47:18* LastEditors: ReBeX 420659880qq.com* LastEditTime: 2023-07-16 16:26:19* FilePath: \cesium-tyro-blog\s…

【动手学深度学习】--07.数值稳定性、模型初始化、激活函数

文章目录 数值稳定性、模型初始化、激活函数1.数值稳定性1.1举例1.2数值稳定性的常见两个问题1.3梯度爆炸1.4梯度消失1.5打破对称性 2.模型初始化2.1让训练更加稳定2.2权重初始化2.3Xavier初始 3.激活函数 数值稳定性、模型初始化、激活函数 学习视频&#xff1a;数值稳定性 …

vue3后台管理系统实现动态侧边导航菜单管理(ElementPlus组件)

记住 一级(el-sub-menu)的都是只是展示的 点击跳转的都是一级下的子级(el-menu-item) 完整展示 1:在登陆功能进行登陆 获取menu列表 注册路由表的时候 把文件进行创建好 因为注册的方法需要获取这个路径 整个router下的main product等等都要创建 //1:发送你的用户名和密码获…

Linux--进程终止

一、进程终止时&#xff0c;操作系统做了什么&#xff1f;&#xff1f; 释放进程申请的相关内核数据结构和对应的代码和数据 本质就是释放系统资源&#xff08;最主要的资源是内存&#xff09; 二、进程终止的常见方式&#xff1f; a.代码跑完&#xff0c;结果正确 b.代码跑完&…

【我的2023上半年总结】感谢CSDN:第一次100w+阅读,赚大了!

大家好&#xff0c;这里是程序员晚枫。 因为工作一般都是996的原因&#xff0c;今天是2023上半年少有的周六休息日&#xff0c;正好看到平台的#2023年中总结#活动&#xff0c;赶紧来分享一下这半年的自媒体收获~ 主要说一些开心的事情 1、CSDN CSDN账号&#x1f449;Python…

MySQL的循环语句分析

1.while循环 复制 -- 设置mysql分隔符为//,也就意味着,当遇到下一个//时,整体执行SQL语句 DELIMITER //DROP PROCEDURE if EXISTS &lsquo;test&rsquo;; # 如果存在test存储过程则删除CREATE procedure test() # 创建无参存储过程,名称为testBEGIN DECLARE i I…

配置 Vite 的环境变量与模式 (.env mode)

目录 创建项目环境变量内建变量创建.env 文件定义变量HTML 环境变量替换 模式 创建项目 npm create vitelatest or yarn create vite or pnpm create vite 环境变量 Vite 在一个特殊的 import.meta.env 对象上暴露环境变量。 console.log(import.meta.env)内建变量 import.met…

关于chatGPT、AI绘画、AI提词器等AI工具国内如何使用

目前的AI潮流非常火热&#xff0c;OPENAI 出的CHATGPT可谓是目前大模型人工智能的代表&#xff0c;刚开始听说chatGPT可以写代码&#xff0c;写作&#xff0c;写方案&#xff0c;无所不能。还有AI绘画也很&#xff2e;&#xff22;作为一个程序员&#xff0c;为了体验这些&…