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

  • 荣耀magic4防水吗(荣耀magic3防水嘛)

    荣耀magic4防水吗(荣耀magic3防水嘛)

  • 敲击苹果手机背面截屏(敲击苹果手机背面)

    敲击苹果手机背面截屏(敲击苹果手机背面)

  • 华为荣耀8手机如何长截屏(华为荣耀8手机负一屏怎么关闭)

    华为荣耀8手机如何长截屏(华为荣耀8手机负一屏怎么关闭)

  • 华为nova3i充电慢怎么回事(华为nova3i充电慢耗电快)

    华为nova3i充电慢怎么回事(华为nova3i充电慢耗电快)

  • WPS页面宽度高度怎么设置(wps页面宽度高度怎么调)

    WPS页面宽度高度怎么设置(wps页面宽度高度怎么调)

  • airpods进水声音变小了(airpods进水声音很小)

    airpods进水声音变小了(airpods进水声音很小)

  • 萤石云sd卡初始化不了(萤石云sd卡初始化)

    萤石云sd卡初始化不了(萤石云sd卡初始化)

  • 钉钉文件怎样发送到QQ上(钉钉文件怎样发送给微信好友)

    钉钉文件怎样发送到QQ上(钉钉文件怎样发送给微信好友)

  • 抖音标志怎么消除(抖音标志去掉)

    抖音标志怎么消除(抖音标志去掉)

  • iphonex贴膜后屏幕不灵敏(苹果x贴膜后触屏不灵敏怎么办)

    iphonex贴膜后屏幕不灵敏(苹果x贴膜后触屏不灵敏怎么办)

  • 苹果11带耳机吗(苹果11带不带有线耳机)

    苹果11带耳机吗(苹果11带不带有线耳机)

  • 小红书开店需要什么条件(小红书开店需要多少钱)

    小红书开店需要什么条件(小红书开店需要多少钱)

  • vivo x7可不可以插sd卡(vivox7可不可以分屏)

    vivo x7可不可以插sd卡(vivox7可不可以分屏)

  • 腾讯微云vip是干啥的(腾讯微云永久会员)

    腾讯微云vip是干啥的(腾讯微云永久会员)

  • 红米note5是LCD屏幕吗(红米note5采用什么屏幕)

    红米note5是LCD屏幕吗(红米note5采用什么屏幕)

  • 计算器off是什么健(计算器off是什么键ac)

    计算器off是什么健(计算器off是什么键ac)

  • reset键盘哪个位置(reset健在哪个位置)

    reset键盘哪个位置(reset健在哪个位置)

  • 腾讯视频会员怎么共享(腾讯视频会员怎么给别人登录)

    腾讯视频会员怎么共享(腾讯视频会员怎么给别人登录)

  • 手机wps如何清除空白页(手机wps如何清除内容)

    手机wps如何清除空白页(手机wps如何清除内容)

  • 手环怎么设置中文(怎么把手环设置成中文)

    手环怎么设置中文(怎么把手环设置成中文)

  • qq头像怎么设置正方形(qq头像怎么设置不让别人看)

    qq头像怎么设置正方形(qq头像怎么设置不让别人看)

  • qq怎么关闭更感兴趣(怎么关闭qq自动更新功能)

    qq怎么关闭更感兴趣(怎么关闭qq自动更新功能)

  • 全民k歌怎么加入合唱(全民k歌怎么加电音)

    全民k歌怎么加入合唱(全民k歌怎么加电音)

  • 苹果上面不显示时间(苹果上面不显示闹钟图标)

    苹果上面不显示时间(苹果上面不显示闹钟图标)

  • 详解Linux系统中安装配置Samba服务器的步骤(linux中!)

    详解Linux系统中安装配置Samba服务器的步骤(linux中!)

  • 新西兰的萨瑟兰瀑布和奎尔湖 (© Michael Rathmayr/plainpicture)(新西兰萨摩亚人)

    新西兰的萨瑟兰瀑布和奎尔湖 (© Michael Rathmayr/plainpicture)(新西兰萨摩亚人)

  • 车辆购置税计算器公式
  • 第四季度报表和年度报表一样吗
  • 营业执照备案需要什么资料
  • 企业有利润要交什么税
  • 购销合同签定有法律效力吗
  • 公司为员工购买社保证明
  • 电子税务局上财务制度备案错误是啥意思
  • 银行承兑汇票到期日期怎么算
  • 委托加工物资属于在产品吗
  • 影响无形资产项目金额的有
  • 异常增值税扣税凭证
  • 税控软件维护
  • 收到银行承兑会计分录
  • 摊销土地使用权和专利权会计分录怎么写
  • 出口转内销补交关税
  • 银行代扣水电费要手续费吗
  • 收到设备租金计入什么会计科目
  • 小微企业季度所得税和企业所得税怎么处理
  • 小微企业需要开公户吗
  • 城建税教育附加税的会计分录
  • 简易征收企业所得税几个点
  • 售后回租业务的会计分录
  • 教育费附加减免性质代码
  • 通讯费 个税
  • 申报缴纳印花税,取得银行缴税凭证
  • 收入冲减费用
  • 本年固定资产投资额与不良贷款的关系
  • 企业成本费用包括哪些
  • 同一控制下合并对价怎么算
  • xlsx长数字
  • 民间非盈利组织会计信息的使用者
  • 新会计规定工会会计制度
  • 什么叫即期结汇
  • 增值税按简易计价方式
  • 今天端午节是几月几号啊
  • 浏览器并发请求队列数量怎么设置
  • 不符合政策和条件的成语
  • 工业企业出租房屋的租金收入应计入
  • 凭证字号怎么写
  • node js 安装
  • php array_search二维数组
  • 控制器eabs
  • 国有资产划转实施方案
  • 应收帐款出售给银行会计分录
  • 企业所得税年报截止日期2023
  • c语言常用函数用法
  • 固定资产报废如何交增值税
  • 加计抵减可以结转吗
  • sql server 2008简介
  • 增值税直接计算法间接计算法举例
  • 已提足折旧的固定资产出售的账务处理
  • 缴纳残保金会计分录怎么做
  • 银行贴现手续费可以税前扣除吗
  • 增值税年末一定要结转吗
  • 建账的内容一般包括什么
  • 怎么用公式计算结果填充单元格
  • 怎样设置windows不更新
  • win7那些自启可以禁用
  • window10自带的软件有哪些
  • mac关机快捷键是什么键
  • macbookpro通知栏
  • centos停止程序
  • awk结果输出到文件
  • linux设置环境变量的命令
  • win7系统鼠标右键没有压缩文件功能
  • windows识别码
  • 微信小程序上传文件的API是
  • docker 开源项目
  • 刚接触 python 如何快速上手?
  • cocos2dx-js
  • nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例
  • 批处理删除重复值
  • 基于javascript的毕业设计
  • javascript基于
  • js的select
  • 阿里云服务器使用教程
  • 长春市税务局电话号
  • 汽车买保险车船税是什么意思
  • 车船税保单哪里打印
  • 个人所得税工资达到多少才交税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设