位置: IT常识 - 正文

【实战】用 Custom Hook + TS泛型实现 useArray(custom用法)

编辑:rootadmin
【实战】用 Custom Hook + TS泛型实现 useArray 文章目录一、题目二、答案(非标准)三、关键知识点1.Custom Hook关键点案例useMountuseDebounce2.TS 泛型关键点一、题目

推荐整理分享【实战】用 Custom Hook + TS泛型实现 useArray(custom用法),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:custom cursor怎么用,customs用法,customs用法,custom cursor怎么用,customize的用法,customize的用法,customs用法,custom用法及搭配,内容如对您有帮助,希望把文章链接给更多的朋友!

完善自定义 Hook —— useArray ,使其能够完成 tryUseArray 组件中测试的功能:

入参:数组返回值:value:最新状态的数组;add:添加元素;removeIndex:移除数组特定位置的元素;clear:清空数组;

相关文件代码:

src\utils\index.tsimport { useEffect, useState } from "react";export const useMount = (cbk: () => void) => useEffect(() => cbk(), []);export const useArray = () => {};src\tryUseArray.tsximport { useArray, useMount } from "utils";const TryUseArray = () => { const persons: { name: string; age: number }[] = [ { name: "jack", age: 25 }, { name: "ma", age: 22 }, ]; const { value, clear, removeIndex, add } = useArray(persons); useMount(() => { // 期待这里报错:Property 'notExist' does not exist on type '{ name: string; age: number; }[]'. // console.log(value.notExist); // 期待这里报错:Property 'age' is missing in type '{ name: string; }' but required in type '{ name: string; age: number; }'. // add({ name: "david" }); // 期待这里报错:Argument of type 'string' is not assignable to parameter of type 'number'. // removeIndex("123"); }); return ( <div> {/*期待: 点击以后增加 john */} <button onClick={() => add({ name: "john", age: 22 })}>add john</button> {/*期待: 点击以后删除第一项*/} <button onClick={() => removeIndex(0)}>remove 0</button> {/*期待:点击以后清空列表*/} <button style={{ marginBottom: "50px" }} onClick={() => clear()}> clear </button> {value.map((person, index) => ( <div key={index} style={{ marginBottom: "30px" }}> <span style={{ color: "red" }}>{index}</span> <span>{person.name}</span> <span>{person.age}</span> </div> ))} </div> );};export default TryUseArray;src\App.tsximport "./App.css";import TryUseArray from "tryUseArray";function App() { return ( <div className="App"> <TryUseArray /> </div> );}export default App;【实战】用 Custom Hook + TS泛型实现 useArray(custom用法)

答答答 案案案 在在在 后后后 面面面 ,,, 没没没 有有有 完完完 成成成 不不不 要要要 偷偷偷 看看看 哦哦哦 !!!

二、答案(非标准)import { useEffect, useState } from "react";// 我的练习作业// export const useArray = <T>(array: T[]) => {// const [value, setValue] = useState(array)// const clear = () => setValue([])// const removeIndex = (index: number) => setValue([...value].filter((item, _index) => _index !== index))// const add = (item: item) => setValue([...value, item]))// return {// value, clear, removeIndex, add// }// }export const useArray = <T>(array: T[]) => { const [value, setValue] = useState(array); return { value, add: (item: T) => setValue([...value, item]), removeIndex: (index: number) => { const temp = [...value]; temp.splice(index, 1); setValue(temp); }, clear: () => setValue([]), };};三、关键知识点1.Custom Hook

官方文档:自定义 Hook – React

关键点定义 Custom Hook 是一个函数,名字必须以 use 开头hook 只能在 React 函数组件 或其他 Hook 函数中调用(普通 js/ts 函数中不可用)相同的 Hook 不共享 state (重用状态逻辑的机制,所有 state 和副作用都是完全隔离的)不要在循环,条件或嵌套函数中调用 Hook(建议在 Hook 内部使用循环,条件或嵌套函数)React 16.8+ 中使用Hook 规则 – React案例useMount封装export const useMount = (cbk: () => void) => useEffect(() => cbk(), []);调用import { useMount } from "utils";const [list, setList] = useState([]);useMount(() => { fetch(`${apiUrl}/list`).then(async (res) => { if (res.ok) { setList(await res.json()); } });});useDebounce封装/** * @param { 值 } val * @param { 延时:默认 1000 } delay * @returns 在某段时间内多次变动后最终拿到的值(delay 延迟的是存储在队列中的上一次变化) */export const useDebounce = <V>(val: V, delay: number = 1000) => { const [tempVal, setTempVal] = useState(val); useEffect(() => { // 每次在 val 变化后,设置一个定时器 const timeout = setTimeout(() => setTempVal(val), delay); // 每次在上一个 useEffect 处理完以后再运行(useEffect 的天然功能即是在运行结束的 return 函数中清除上一个(同一) useEffect) return () => clearTimeout(timeout); }, [val, delay]); return tempVal;};调用import { useDebounce } from "utils";// 对 param 进行防抖处理const lastParam = useDebounce(param);const [list, setList] = useState([]);useEffect(() => { fetch( // name=${param.name}&personId=${param.personId} `${apiUrl}/projects?${qs.stringify(lastParam)}` ).then(async (res) => { if (res.ok) { setList(await res.json()); } });}, [lastParam]);

注意区别于 节流

拓展学习:

【笔记】Custom Hook2.TS 泛型

官方文档:

TypeScript: Documentation - Generics泛型(generic) - TypeScript 中文手册关键点不预先指定其具体的类型,而在使用的时候再进行定义函数是对“值”的编程,泛型是对“类型”的编程泛型是类型的变量

拓展学习:

【笔记】TS 泛型
本文链接地址:https://www.jiuchutong.com/zhishi/300147.html 转载请保留说明!

上一篇:魔改并封装 YoloV5 Version7 的 detect.py 成 API接口以供 python 程序使用(魔改toolbox)

下一篇:css圆角边框怎么设置(css圆角边框弧度代码)

  • 呼叫转移设置方法(呼叫转移设置方法oppo)

    呼叫转移设置方法(呼叫转移设置方法oppo)

  • 火绒如何拦截电脑弹窗广告(火绒拦截电脑弹窗广告为什么还有)

    火绒如何拦截电脑弹窗广告(火绒拦截电脑弹窗广告为什么还有)

  • 接视频没有声音是怎么回事(接视频没有声音是怎么回事手机)

    接视频没有声音是怎么回事(接视频没有声音是怎么回事手机)

  • 三星s20支持的5g频段(三星s20支持的充电功率)

    三星s20支持的5g频段(三星s20支持的充电功率)

  • 淘宝退货淘金币会退回吗(淘宝退货淘金币和红包怎么办吗)

    淘宝退货淘金币会退回吗(淘宝退货淘金币和红包怎么办吗)

  • 美团会员季卡是多少个月(美团的季卡是几个月)

    美团会员季卡是多少个月(美团的季卡是几个月)

  • 滴滴顺路单是不是优先派(滴滴顺路单不开导航能接单吗)

    滴滴顺路单是不是优先派(滴滴顺路单不开导航能接单吗)

  • 华为gt2与gt2e区别(华为gt2跟华为gt2e有什么区别)

    华为gt2与gt2e区别(华为gt2跟华为gt2e有什么区别)

  • airpods序列号区分国行(airpods 序列号含义)

    airpods序列号区分国行(airpods 序列号含义)

  • 无线能连上但是上不了网(怎么连接无线网)

    无线能连上但是上不了网(怎么连接无线网)

  • 苹果无痕浏览还能看到记录吗(苹果无痕浏览还会被运营商记录吗)

    苹果无痕浏览还能看到记录吗(苹果无痕浏览还会被运营商记录吗)

  • mb和mbps的区别(mbps与mb/s的关系)

    mb和mbps的区别(mbps与mb/s的关系)

  • 微信语音最多几人(微信语音最多几个人)

    微信语音最多几人(微信语音最多几个人)

  • 路由器信道是什么意思(路由器信道有什么用)

    路由器信道是什么意思(路由器信道有什么用)

  • net代表的机构是什么(net什么机构)

    net代表的机构是什么(net什么机构)

  • 微信隐藏手机号在哪设置(企业微信隐藏手机号)

    微信隐藏手机号在哪设置(企业微信隐藏手机号)

  • 华为手机怎么弄小窗口(华为手机怎么弄微信分身)

    华为手机怎么弄小窗口(华为手机怎么弄微信分身)

  • 怎么删抖音视频(怎么删抖音视频作品)

    怎么删抖音视频(怎么删抖音视频作品)

  • 手机为什么不能快充了(手机为什么不能截屏)

    手机为什么不能快充了(手机为什么不能截屏)

  • 拼多多金猪图标怎么取消(怎么把拼多多金猪浮标去除)

    拼多多金猪图标怎么取消(怎么把拼多多金猪浮标去除)

  • 苹果x怎么调护眼模式(苹果X怎么调护眼)

    苹果x怎么调护眼模式(苹果X怎么调护眼)

  • 打电话通话结束什么意思(打电话通话结束流量又能用什么原因)

    打电话通话结束什么意思(打电话通话结束流量又能用什么原因)

  • 手机出现hd2啥意思(手机出现hd2是什么)

    手机出现hd2啥意思(手机出现hd2是什么)

  • 苹果xr有三维触控吗(xr有三维触控嘛)

    苹果xr有三维触控吗(xr有三维触控嘛)

  • 趣专享30元如何提现(趣专享福利版怎么样)

    趣专享30元如何提现(趣专享福利版怎么样)

  • 微信如何备注手机联系人(微信如何备注手机号码)

    微信如何备注手机联系人(微信如何备注手机号码)

  • 华为类似siri功能(华为手机类似siri)

    华为类似siri功能(华为手机类似siri)

  • vue-treeselect 的基本使用(vue treegrid)

    vue-treeselect 的基本使用(vue treegrid)

  • 注册税务师的报名条件、时间及考试
  • 安装服务费税率是多少
  • 车船税不交怎么办
  • 开票名称开错了
  • 申报个税大病医疗如何申报
  • 专票手工认证
  • 房地产开发企业的土地使用权计入哪里
  • 企业政策性搬迁损失的所得税处理
  • 出口退税的报关单当月可以申请退税吗?
  • 承担客户装修费怎么入账
  • 第三方佣金及成本还是费用
  • 印花税少提了怎么办
  • 以库存现金代垫怎么做账
  • 增值税发票小规模2023
  • 增值税专用发票几个点
  • 广告公司广告费会计分录
  • 营业账簿印花税怎么算
  • 劳务费发票可以含材料费吗
  • 票据单据较多,费用报销单一张不够填怎么办?
  • 低税负销售激励策略的设计与案例!
  • 施工企业建账指的是什么
  • 会议费税前扣除标准2021
  • 固定资产进项发票怎么开
  • 企业筹建期的工会金费怎么入账
  • 产品研发的规则
  • 销项税月底还是年底结0
  • 购入低值易耗品一批,实际成本4000元
  • 增值税的征收范围包括在中华人民共和国境内
  • win11前面板耳机没声音
  • 腾讯电脑管家游戏模式
  • win10蓝牙驱动程序下载
  • 员工离职补偿金计算方法
  • 未开票收入跨年可以冲回吗
  • php怎么添加背景图片
  • 申请高新技术企业收入要多少
  • 老税号的发票还能认证吗
  • 为什么生产工人工资不属于固定成本
  • 商企预提待付的钱怎么办
  • 小程序开发公司十大排名
  • 利用php将图片转为文字
  • chcp命令
  • 开发票时有哪些规定呢?
  • 个人所得税专项附加扣除标准一览表
  • 综合所得内容有哪些
  • 网上报税优点与缺点
  • mysql中用户和权限的作用
  • 没有数字的公章有效吗
  • 个人所得税是可以全部退回吗
  • 长期投资减值准备属于什么会计科目
  • 小规模纳税人的增值税计入成本吗
  • 新收入准则确认收入的条件
  • 一个人可以做多个担保人吗
  • 帮客户代付保证金合法吗
  • 多计的人工成本怎么做账
  • 农产品怎么自产自销
  • 被代持股份的股东需要负责吗
  • 房地产行业的特殊性表现在哪些方面
  • 无形资产摊销年限最新规定
  • 应收账款和坏账准备的解题思路
  • 会计中结转属于什么科目
  • Sqlserver timestamp数据类使用介绍
  • sql行列转换方式
  • win10怎么关闭防火系统
  • 深入解析windows第8版
  • xp电脑关机后自动重启是什么原因
  • linux打包压缩文件的命令
  • linux从一个命令获取数据到另一个命令
  • [置顶]游戏名:chivalry2
  • 批处理/a
  • node.js详解
  • javascrpt绑定事件之匿名函数无法解除绑定问题
  • python基础教程电子版
  • axios原理和实现
  • jQuery使用zTree插件实现树形菜单和异步加载
  • 开的发票怎么抽奖
  • 青岛地税局 局长
  • 移动退订业务怎么恢复
  • 广西税务登记查询网站
  • 增值税运输费用税额计算
  • 什么是从价计征,从量计征
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设