【vue3】一些关于hooks的使用经验

前言

最近接到了一个需求,隔壁嵌入式部门希望我们用前端解析渲染Kconfig表单。这篇文章用来记录一下本次使用hook + pinia + vue3的经验

hooks

hooks的概念最早是在 React 中听到的,虽然早些时间也写过一点react,但也只是照葫芦画瓢,并不得要领。比如我一直觉得所谓的hook就是像react一样,使用以下语法

// react hook 写法
const [value, setValue] = useValue();// vue2 普通写法
data: {value
},
method: {setValue(newVal) {...}
}

可以看见,其实原始的写法与hook的写法差距是蛮大的。
原始是在data里创建变量,至于变量的更新,自己在method里定义函数即可。
而hook的写法是通过 useXXX() 创建变量和变量更新的函数。

那么hook的写法,到底有什么好处呢?

逻辑复用、可插拔

export function useCounter() {const count = ref(0);function increment() {count.value++;}function decrement() {count.value--;}return {count,increment,decrement};
}

上述示例中,useCounter 函数用于创建一个计数器逻辑,包含了一个 count 变量和两个操作函数 incrementdecrement。可以在多个组件中使用 useCounter 函数,实现逻辑的复用。

如果是原始的方式,我们就必须在每个页面写 counterincrementdecrement 是一件繁琐的事情。当然,我们也可以抽离,但抽离到单独的文件中去引用时,又会有作用域的问题,导致每个页面使用的 counter 变量是同一个变量,会出现新的问题。

于是不得不再提到一个实用的场景: flag 标志位 控制显示与隐藏。

// hook.ts
export function useFlag(initVal: boolean) {const flag = ref(initVal);function setFlag(newVal: boolean) {flag.value = newVal}return {flag,setFlag};
}// 页面中使用
const { flag, setFlag } = useFlag(true);

在上述代码中,最后在页面使用了 hook ,每个页面都可以使用这个 hook 且作用域不同,不会相互影响。

更易抽离,逻辑更清晰

上面提到了 useFlag 的 hook ,此时有一个新需求,当每个组件的显隐都需要进行一些相同的逻辑判断控制显隐,此时怎么办?
我们可以创建一个新的 hook

import { useFlag } from '@/hooks/useFlag'
import { handleDepends_on } from '@/utils/util';export const useDepend = (data) => {const { result } = useStore('result');const { flag, setFlag } = useFlag(true);const dependList = handleDepends_on(data.depends_on);watch(result, () => {// 首先置位truesetFlag(true)// 如果出现不满足,则置位falsedependList.map(item => {if (!result.value[item]) setFlag(false)})}, { immediate: true, deep: true })return {flag}
}

pinia 中的 result 变量变化时,会触发 watch 监听函数。如果 flag 改变,页面里的 flag 也会同步,并更新视图。

因此只需要在每个需要逻辑判断的页面输入两行,即可完成判断逻辑的复用~

import { useDepend } from '@/hook/useDepend';
const { flag } = useDepend('数据')

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BT8959T2/5 LCD 驱动

1 Preface/Foreword LCD驱动路径:app/gui/lcd/ SDK默认的LCD驱动:lcd_gc9c01.c 2 数据结构 3 代码分析

更换Eclipse的JDK版本

点击window->Preferences 选择Installed JREs 点击 Add 按钮, 选择Standard VM, 点击 Next。然后选择自己安装的JDK路径

[Vue3 博物馆管理系统] 使用Vue3、Element-plus tabs组件构建选项卡功能

系列文章目录 第一章 定制上中下(顶部菜单、底部区域、中间主区域显示)三层结构首页 第二章 使用Vue3、Element-plus菜单组件构建菜单 第三章 使用Vue3、Element-plus走马灯组件构建轮播图 第四章 使用Vue3、Element-plus tabs组件构建选项卡功能 [第五…

搭建关键字驱动自动化测试框架

前言 那么这篇文章我们将了解关键字驱动测试又是如何驱动自动化测试完成整个测试过程的。关键字驱动框架是一种功能自动化测试框架,它也被称为表格驱动测试或者基于动作字的测试。关键字驱动的框架的基本工作是将测试用例分成四个不同的部分。首先是测试步骤&#…

教你如何快速阅读葡萄酒标签

我们经常被问及葡萄酒标签上写了什么,总体而言这些信息可以分为四个关键部分,第一品牌或生产商;第二国家或地区;第三葡萄品种;第四年份。 第一品牌或生产商,在寻找葡萄酒的制造商时,著名的品牌名…

论文解读 | 三维点云深度学习的综述

原创 | 文 BFT机器人 KITTI 是作为基准测试是自动驾驶中最具影响力的数据集之一,在学术界和工业界都被广泛使用。现有的三维对象检测器存在着两个限制。第一是现有方法的远程检测能力相对较差。其次,如何充分利用图像中的纹理信息仍然是一个开放性的问题…

DDD 与 CQRS 才是黄金组合

在日常工作中,你是否也遇到过下面几种情况: 使用一个已有接口进行业务开发,上线后出现严重的性能问题,被老板当众质疑:“你为什么不使用缓存接口,这个接口全部走数据库,这怎么能抗住&#xff01…

MATLAB中movmean函数用法

目录 语法 说明 示例 向量的中心移动平均值 向量的尾部移动平均值 矩阵的移动平均值 包含缺失值的向量的移动平均值 基于样本点计算移动平均值 仅返回满窗口平均值 movmean函数的功能是对数据进行移动求平均值。 语法 M movmean(A,k) M movmean(A,[kb kf]) M mov…

C++多态案例2----制作饮品

#include<iostream> using namespace std;//制作饮品的大致流程都为&#xff1a; //煮水-----冲泡-----倒入杯中----加入辅料//本案例利用多态技术&#xff0c;提供抽象类制作饮品基类&#xff0c;提供子类制作茶叶和咖啡class AbstractDrinking {public://煮水//冲水//倒…

ubuntu 22.04安装cuda、cudnn、conda、pytorch

1、cuda 视频连接 https://www.bilibili.com/video/BV1bW4y197Mo/?spm_id_from333.999.0.0&vd_source3b42b36e44d271f58e90f86679d77db7cuda 11.8 https://developer.nvidia.com/cuda-toolkit-archive点击进入 https://developer.nvidia.com/cuda-11-8-0-download-arc…

【Mysql】Mysql获取排班时间段中的休息时间段方法

在MySQL中&#xff0c;可以使用自连接&#xff08;self-join&#xff09;来获取上一条记录的结束时间和下一条记录的开始时间&#xff0c;并将它们组合成一条记录。首先&#xff0c;需要为表创建一个包含记录ID和时间信息的临时表&#xff0c;然后使用自连接获取相邻记录的时间…

【Redis7】--1.概述、安装和配置

文章目录 1.Redis概述1.1Redis是什么1.2Redis与MySQL的关系1.3Redis功能1.4Redis优势 2.Redis的安装和配置 1.Redis概述 1.1Redis是什么 Redis全称 远程字典服务器&#xff08;Remote Dictionary Server&#xff09;&#xff0c;它是完全开源的&#xff0c;使用ANSIC语言编写…