当前位置: 首页 > news >正文

网上商城建设 网站定制开发浙江专业网站seo

网上商城建设 网站定制开发,浙江专业网站seo,设计欣赏,到哪里做网站文章目录一、题目二、答案(非标准)三、关键知识点1.Custom Hook关键点案例useMountuseDebounce2.TS 泛型关键点一、题目 完善自定义 Hook —— useArray ,使其能够完成 tryUseArray 组件中测试的功能: 入参:数组返回…

文章目录

  • 一、题目
  • 二、答案(非标准)
  • 三、关键知识点
    • 1.Custom Hook
      • 关键点
      • 案例
        • useMount
        • useDebounce
    • 2.TS 泛型
      • 关键点


一、题目

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

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

相关文件代码:

  • src\utils\index.ts
import { useEffect, useState } from "react";export const useMount = (cbk: () => void) => useEffect(() => cbk(), []);export const useArray = () => {};
  • src\tryUseArray.tsx
import { 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.tsx
import "./App.css";
import TryUseArray from "tryUseArray";function App() {return (<div className="App"><TryUseArray /></div>);
}export default App;

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

二、答案(非标准)

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 Hook

2.TS 泛型

官方文档:

  • TypeScript: Documentation - Generics
  • 泛型(generic) - TypeScript 中文手册

关键点

  • 不预先指定其具体的类型,而在使用的时候再进行定义
  • 函数是对“值”的编程,泛型是对“类型”的编程
  • 泛型是类型的变量

拓展学习:

  • 【笔记】TS 泛型
http://www.sczhlp.com/news/25049/

相关文章:

  • 外贸soho做网站怎么做网络游戏排行榜百度风云榜
  • 上海做网站大的公司有哪些百度竞价关键词优化
  • 广州现在有疫情吗天津seo外包
  • 魔兽做宏网站建网站平台
  • 网站建设的目的青岛网站建设方案服务
  • 【IEEE出版】第十一届能源材料与电力工程学术会议(ICEMEE 2025)
  • 怎么免费安装dw广州网站优化推广
  • 网络销售面试问题有哪些杭州网站优化公司哪家好
  • 手机站建设seo公司优化方案
  • 做房产抵押网站需要什么全国疫情排行榜
  • 临沂网站建设设计收录情况有几种
  • 西安市建设工程信息网工程交易平台官网太原seo外包服务
  • 潍坊市网站建设公司深圳全网营销哪里好
  • 文本网站代码空两格怎么做中国十大互联网公司排名
  • 怎么给网站做第三方app零基础学什么技术好
  • 云电脑 vs 传统PC:全面对比3A游戏与AI训练的成本与性能 - 教程
  • 【算法分享】快速幂与矩阵快速幂算法详解
  • 河南省工程建设监理协会网站百度竞价推广代理商
  • 租房网站开发文献综述模板山东公司网站推广优化
  • 外贸网站如何做外链拉新app推广接单平台
  • 建网站引流做淘宝宁德市医院东侨院区
  • 网站备案每年一次网址大全百度
  • 淘宝客网站搜索怎么做重庆seo是什么
  • 不花钱网站怎么做推广北京百度seo排名公司
  • app立即打开山西seo关键词优化软件搜索
  • icp备案网站用不了2023很有可能再次封城吗
  • 南京华典建设有限公司网站免费的建站平台
  • 我的SSM框架自学2 - 教程
  • 【IEEE出版】第八届IEEE机电一体化与计算机技术工程国际学术会议(MCTE 2025)
  • 【IET出版】2025年人工智能与计算工程国际学术会议(AICE 2025)