位置: 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圆角边框弧度代码)

  • 海康威视默认8位密码是多少(海康威视默认8位密码是多少但是输入12345还是显示错误)

    海康威视默认8位密码是多少(海康威视默认8位密码是多少但是输入12345还是显示错误)

  • 如何关闭微信运动(如何关闭微信运动步数不让别人看见)

    如何关闭微信运动(如何关闭微信运动步数不让别人看见)

  • 荣耀30青春版和荣耀30的区别(荣耀30青春版和荣耀20哪个好)

    荣耀30青春版和荣耀30的区别(荣耀30青春版和荣耀20哪个好)

  • 直播对方能看到你脸吗(点开直播对方能看见)

    直播对方能看到你脸吗(点开直播对方能看见)

  • 苹果x和11区别(苹果x和11一样吗)

    苹果x和11区别(苹果x和11一样吗)

  • iphone系统更新是灰色的(iphone.系统更新)

    iphone系统更新是灰色的(iphone.系统更新)

  • 抖音视频设为私密影响权重吗(怎么把抖音所有视频设置私有)

    抖音视频设为私密影响权重吗(怎么把抖音所有视频设置私有)

  • moa al00是什么型号(moa-al00参数)

    moa al00是什么型号(moa-al00参数)

  • 互联网账号什么意思(互联网账号什么时候注销)

    互联网账号什么意思(互联网账号什么时候注销)

  • 微信批量注册限制登录(微信 批量注册)

    微信批量注册限制登录(微信 批量注册)

  • 短信设置了密码在哪里解除(苹果手机短信怎么设置密码)

    短信设置了密码在哪里解除(苹果手机短信怎么设置密码)

  • 计算机计算能力的关键特点(计算机计算能力概念)

    计算机计算能力的关键特点(计算机计算能力概念)

  • 快手具体发布时间(快手发布时间段)

    快手具体发布时间(快手发布时间段)

  • 京东还送货吗(京东送货吗现在)

    京东还送货吗(京东送货吗现在)

  • 快手别人发的作品怎么下载(快手上自己发布的作品别人怎么看到)

    快手别人发的作品怎么下载(快手上自己发布的作品别人怎么看到)

  • 微信闪图怎么发送(微信怎么看原图照片)

    微信闪图怎么发送(微信怎么看原图照片)

  • 华为的充电接口叫什么(华为的充电接口可以充苹果吗)

    华为的充电接口叫什么(华为的充电接口可以充苹果吗)

  • 怎么把旧苹果手机的东西导入新苹果手机(怎么把旧苹果手机通讯录转到新苹果)

    怎么把旧苹果手机的东西导入新苹果手机(怎么把旧苹果手机通讯录转到新苹果)

  • 苹果手机通讯录怎么导入到华为手机(苹果手机通讯录联系人重复怎样处理)

    苹果手机通讯录怎么导入到华为手机(苹果手机通讯录联系人重复怎样处理)

  • excel冻结在哪个位置(excel表格冻结窗口在哪里)

    excel冻结在哪个位置(excel表格冻结窗口在哪里)

  • 电脑音量快捷键(调节电脑音量快捷键)

    电脑音量快捷键(调节电脑音量快捷键)

  • 基于springboot的家政服务管理平台(源码,设计文档等)(基于springboot的购物商城)

    基于springboot的家政服务管理平台(源码,设计文档等)(基于springboot的购物商城)

  • 解决node-sass下载不成功的问题(node_sass)

    解决node-sass下载不成功的问题(node_sass)

  • 个税返还手续费增值税申报填在哪里
  • 一般纳税人附加税优惠政策2023
  • 企业税申报的三种方式
  • 广交会展务
  • 当月个税申报的是几月的工资表
  • 应付账款周转率和存货周转率公式
  • 个税哪种申报方式计税最好
  • 厂房设计费计入在建工程吗
  • 分公司可以用总公司的业绩吗
  • 部分红冲的发票怎么开
  • 个税申报的收入是应发工资还是实发工资
  • 公司购买车辆抵扣税
  • 增值税是购货方交还是销货方交
  • 收到一笔误缴的税款
  • 个体户季度报税表怎么填
  • 老板想提取销售公积金
  • 接受投资者的无形资产
  • 西安的税务局
  • 农产品增值税免税政策
  • 7月1日前购进的农产品如何抵扣
  • 简易计税借方余额
  • 前期物业管理公司
  • 有限责任公司自然人独资可以增加股东吗
  • 公司非本单位退休人员发放工资
  • 借老板的现金存入银行怎么做账?
  • 苹果电脑使用u盘之前需要设置什么?
  • 蛋糕店盈亏平衡分析
  • PHP:xml_get_current_line_number()的用法_XML解析器函数
  • 员工辞退补偿金需要交个税吗
  • 解决口苦最快的方法
  • 商铺转让权是什么意思
  • 公司为员工缴纳社保的法律规定
  • 向银行贷款资金成本率计算公式是什么
  • 事业单位会计准则是否废止
  • php手机号隐藏中间四位
  • 带你看看房间英语怎么写
  • 开票缴纳的1%个税是多少
  • 租用办公设备
  • php随机ip访问
  • 政府补助的会计准则
  • 差旅费账务处理例子
  • dedecms怎么用
  • mysql的删除
  • mongodb主备配置
  • 文化传媒公司介绍
  • 外汇保值业务的特点包括
  • sql2005使用
  • 兼职老师工资小时多少钱
  • 房产税的纳税人包括
  • 网上代增值税专用发票
  • 开劳务发票需要的资料有哪些?
  • 事业单位没有
  • 开具电费发票如何入账?
  • 外借资质交企业所得税怎么交
  • 跟老师出差路上可以聊些什么
  • 机器配件属于什么类型的商品
  • 如何关闭系统快捷键
  • reg.exe是什么程序
  • win10屏幕显示
  • mac怎么录制
  • u盘安装win8系统教程
  • mac系统怎么查看
  • ati2plab.exe是什么进程 ati2plab进程安全吗
  • 微软报错是什么意思
  • win7j
  • win7 设置
  • win10的三个安全问题
  • win7系统的桌面图标怎么调出来
  • 批处理删除注册表指定项
  • Mongoose中document与object的区别示例详解
  • shell脚本 -ne 0
  • js中key
  • javascript基于什么的语言
  • jquery插件免费下载
  • javascript面向对象编程 PDF
  • 如何查询车辆购置税是否缴纳
  • 别人给公司开的普票,怎么查询
  • 开专票需要什么资料
  • 中国移动的电子协议推送服务是什么
  • 物业监控不完善怎么提意见
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设