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

  • 所得税禁止扣除项目
  • 计税工资和实发工资不一样所得税
  • 公司收到生育津贴不发给员工 分录
  • 房地产购买材料财务报销单上怎么写
  • 消防公司支付劳务费会计处理
  • 销售折扣怎么开
  • 厂房怎么计提折旧费
  • 会计速动比率怎么算
  • 待摊费用不要了怎么做账?
  • 怎么调整应收账款账龄
  • 企业取暖费怎么做会计分录
  • 公允价值变动损益在利润表哪里
  • 合并利润表抵消事项包括
  • 发票勾选没有确认怎么办
  • 购入的苗木种植一段时间后再销售要交增值税吗?
  • 税控盘维护费优惠政策
  • 印花税滞纳金计入什么科目
  • 防伪开票系统税票如何抵扣
  • 公司用的冰箱
  • 收到个人实收资本怎么做账
  • 企业为员工购买团体医疗险可以全额税前扣除
  • 小规模税控盘服务费怎么填增值税申报表
  • 基础研究投入费用包含工资吗
  • 资源税改革最新政策
  • 退货应该怎么记账
  • 酒店布草洗涤赔偿怎样折旧
  • 电脑每次开机都要磁盘检查是什么原因
  • 别人利息没给怎么发问
  • adguard安全
  • thinkphp use命名空间
  • php生成php文件
  • wordpress自定义api
  • 收到厂家赠送商品入库
  • 呆账核销分录
  • 厂房改造支出可以计入厂房价值吗
  • webpack常用属性
  • php xdebug配置
  • 资产减值损失如何确定
  • ps像素分辨率什么意思
  • 其他科技推广服务业可以加计扣除吗
  • 己经认证的发票怎么作废
  • 结转材料成本差异所需科目
  • 其他应收款主要核算什么
  • 认缴制和实缴制的法律责任
  • sqlserver怎么把数据库导出来
  • 库存商品入库的会计分录怎么写
  • 本期无销项税额,勾选抵扣的进项税填在哪里
  • 转让股权收入属于收入总额吗
  • 税收完税证明怎么做账
  • 超期未备案可以投诉么
  • 网络管理费用
  • 资产负债表里的应交税费怎么填
  • 全额抵扣怎么申报
  • mysql数据库优化面试题
  • mysql 5.7.9 winx64在windows上安装遇到的问题
  • mysqld关闭
  • xp系统为什么不能用了
  • xp系统无法更换桌面壁纸
  • winmysqladmin.exe - winmysqladmin进程是什么意思
  • mac新版系统
  • 红帽子在工地上是什么级别
  • Win7系统电脑开不开机怎么办
  • linux免安装软件
  • node.js安装后自带哪个工具
  • android不同module怎么相互调用
  • wifi显示开发状态
  • Android游戏开发读后感
  • unity游戏之友利拟收购《刀塔传奇》发行商中清龙图
  • javascript重点
  • Nodejs sublime text 3安装与配置
  • php获取当前脚本路径
  • 常用服务器配置
  • js 根据时间排序
  • nodejs ejs
  • javascript的核心组成部分
  • Jquery实现select multiple左右添加和删除功能的简单实例
  • 广东国家税务局电话
  • 税务局发涵有几种
  • 车辆购置税查询平台打印
  • 国税局可以办理什么业务
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设