• react hook


    一:hook的定义

    Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性。

    二:使用react hook的好处

    1.使用类组件,相关逻辑的代码会被分割到不同生命周期函数中,比如订阅监听与解绑 ,需要在 componentDidMount 中注册监听,而却需要在componentWillUnMount中解绑。相关逻辑的代码被拆分到了不同的生命周期函数中,而毫无关联的代码又被放在同一个生命周期函数中(比如获取数据以及注册监听都会放到componentDidMount中),使用hook可以很好的优化这一问题,可以将不同逻辑的代码分开,相同逻辑的代码放到一起。

    2.使用hook可以简化开发者的工作,使用hook,开发者可以不用理解javaScript中的this ,也不同给函数绑定this。

    三:hook 以及作用

    1.useState

    使用示例:

    const [state, setState] = useState(initialState);

    useState接受初始值或者 函数(返回初始值) , 返回一个state以及更新state的函数

    setState 函数用于更新 state。它接收一个新的 state 值并将组件的一次重新渲染加入队列

    setState(newState);

    函数式更新

    如果新的state需要通过先前的state计算得出,则传递给setState一个函数,该函数接受原来的state作为参数,返回新的state,下面的例子展示了setState的两种用法

    1. function Counter({initialCount}) {
    2. const [count, setCount] = useState(initialCount);
    3. return (
    4. <>
    5. Count: {count}
    6. <button onClick={() => setCount(initialCount)}>Resetbutton>
    7. <button onClick={() => setCount(prevCount => prevCount - 1)}>-button>
    8. <button onClick={() => setCount(prevCount => prevCount + 1)}>+button>
    9. );
    10. }

    如果你的更新函数返回值与当前 state 完全相同,则随后的重渲染会被完全跳过。

    2.useEffect

    使用示例:

    1. // 相当于componentDidMount
    2. useEffect(()=>{
    3. // ...
    4. },[])
    5. //相当于componentDidMount + componentDidUpdate
    6. useEffect(()=>{
    7. ...
    8. })
    9. // 相当于componentWillUnmount
    10. useEffect(()=>{
    11. ...
    12. return () => {
    13. }
    14. },[])

    3.useCallback 和useMemo

    useCallback和useMemo都是做优化工作的

    它们的不同点:

    useCallbackuseMemo
    返回值一个缓存的函数一个缓存值
    参数需要缓存的函数以及依赖需要缓存的值以及依赖
    使用场景

    父子组件之间的优化

    父组件传给子组件的props中有函数,当父组件更新时,函数会重新生成,函数的引用会改变,子组件的props会改变导致子组件重新渲染。使用useCallback可以将函数缓存下来,只有当依赖项改变时才会重新生成函数,依赖项没改变时会返回上一次的缓存函数,子组件的props就不会改变,子组件就不会重新渲染,以此提高了效率

    单个组件的优化

    有一些计算并不是组件每次渲染都需要执行的,可以将这些值缓存下来,如果组件重新渲染了,但是依赖项没有改变时,直接返回上一次的缓存值。减少了计算次数,以此提高了效率

    4.useRef

    useRef 返回一个可变的 ref 对象,其 .current 属性被初始化为传入的参数(initialValue)。返回的 ref 对象在组件的整个生命周期内保持不变。

    本质上,useRef 就像是可以在其 .current 属性中保存一个可变值的“盒子”。

    使用示例:

    1. function TextInputWithFocusButton() {
    2. const inputEl = useRef(null);
    3. const onButtonClick = () => {
    4. // `current` 指向已挂载到 DOM 上的文本输入元素
    5. inputEl.current.focus();
    6. };
    7. return (
    8. <>
    9. <input ref={inputEl} type="text" />
    10. <button onClick={onButtonClick}>Focus the inputbutton>
    11. );
    12. }

  • 相关阅读:
    jquery中 offset()计算的偏移量 和 原生Dom计算的偏移量不一致;
    不需要服务器,教你仅用30行代码搞定实时健康码识别
    03. Springboot集成Mybatis-flex(一)
    设计模式-用代理模式(Proxy Pattern)来拯救你的代码:打造可靠的程序设计
    模拟实现memcpy memmove,字符类库函数的介绍,strerror,strtok的使用讲解。
    SpringBoot+原生HTML+MySQL开发的电子病历系统源码
    Tableau1——条形图和直方图
    Python常用视频编辑操作——读取与保存视频、更改帧数、拼接视频、视频语音合并、视频与图像互转等
    【开发小记】elementUI面包屑跳到二级路由仍然保持父级导航栏高亮
    金融业信贷风控算法5-时间序列模型概述
  • 原文地址:https://blog.csdn.net/shuoxi666/article/details/128001897