• 你所不知道的React Hooks


    使用React Hooks的好处
    • 可以在不使用class的情况下定义状态

    • 方便复用

    • 通过useEffect可以允许我们按照代码的用途分离它们,而不用在生命周期中,将相关的逻辑放到不同的生命周期中。

    • Effect会在每次更新时都会运行(避免了使用class组件时忘记正确的处理componentDidUpdate

    • 可传递数组作为 useEffect 的第二个可选参数便可以只在传的数组变化时才执行,提升性能

    • 清爽的代码风格+代码量更少

    class Example{
       hello: string;
       constructor(){
          this.hello = 'hello world'
       }
    }
    
    // 代码量更少
    function Example(){
       const hello:string = 'hello world'
    }
    
    使用React Hooks的坏处
    • 大量闭包导致问题错误
    • 响应式的useEffect,当useEffect依赖某个函数的不可变性,这个函数的不可变性又依赖于另一个函数的不可变性,这样便形成了一条依赖链。一旦这条依赖链的某个节点意外地被改变了,你的useEffect就被意外地触发了,如果你的useEffect是幂等的操作,可能带来的是性能层次的问题,如果是非幂等,那就糟糕了
    • 状态不同步(当我们有异步操作的时候,经常会碰到异步回调的变量引用是之前的,也就是旧的(这里也可以理解成闭包))——可用useRef来调用
    // 状态不同步
    import React, { useState } from "react";
    ​
    const Counter = () => {
      const [counter, setCounter] = useState(0);
    ​
      const onAlertButtonClick = () => {
        setTimeout(() => {
          alert("Value: " + counter);
        }, 3000);
      };
    ​
      return (
        <div>
          <p>You clicked {counter} times.</p>
          <button onClick={() => setCounter(counter + 1)}>Click me</button>
          <button onClick={onAlertButtonClick}>
            Show me the value in 3 seconds
          </button>
        </div>
      );
    };
    ​
    export default Counter;
    
    // 使用useRef()
    import React, { useState, useRef, useEffect } from "react";
    ​
    const Counter = () => {
      const [counter, setCounter] = useState(0);
      const counterRef = useRef(counter);
    ​
      const onAlertButtonClick = () => {
        setTimeout(() => {
          alert("Value: " + counterRef.current);
        }, 3000);
      };
    ​
      useEffect(() => {
        counterRef.current = counter;
      });
    ​
      return (
        <div>
          <p>You clicked {counter} times.</p>
          <button onClick={() => setCounter(counter + 1)}>Click me</button>
          <button onClick={onAlertButtonClick}>
            Show me the value in 3 seconds
          </button>
        </div>
      );
    };
    ​
    export default Counter;
    
    如何避免React Hooks的常见问题?
    • 不要在useEffect里面写太多的依赖项,将这些依赖项划分成多个单一功能的useEffect。使其遵循设计模式中的“单一职责模式”
    • 当碰到状态不同步的问题时,可以采用手动传递参数到函数或者上面的useRef
       // showCount的count来自父级作用域 
       const [count,setCount] = useState(xxx); 
       function showCount(){ console.log(count) } 
       
       // showCount的count来自参数 
       const [count,setCount] = useState(xxx); 
       function showCount(c){ console.log(c) }
    
    • 重视eslint-plugin-react-hooks插件的警告
    • 当业务比较复杂时,使用 Component 代替 hooks

    将hooks 和 Component组件 混合使用,简单的业务可以使用hooks,更易维护复用,代码量少,复杂的业务,为了避免出现意想不到的问题,可以使用Component

  • 相关阅读:
    php 将英文引号成对转换为中文引号
    centos 6.2 x86_64 编译安装 httpd2.4.2时,apr报错
    PHP在通过非HTTP方式或多客户端的情况下,session的共享
    用c链接mysql
    多进程和多线程有什么区别
    进程和线程的区别
    linux中重要数据声明
    春节后返校第三天
    窗外下着雨——来到南京的第一篇
    中断门与陷阱门的区别
  • 原文地址:https://www.cnblogs.com/zpsakura/p/14379204.html
Copyright © 2020-2023  润新知