React -- (7) 对react hook的理解and与生命周期的关系

80 阅读2分钟

一. React Hooks 的理解

实际上,类组件和函数组件是两套不同的设计思想:类组件----面向对象 and 函数组件----函数式编程。而函数组件更契合 React 框架的设计理念。

React 组件本身的定位就是函数,一个输入数据、输出 UI 的函数。 其主要工作就是及时地把声明式的代码转换为命令的式的 DOM 操作,把数据层面的描述映射到用户可见的 UI 变化中去。即原则上讲,React 的数据应该总是和渲染绑定在一起的, 而类组件却做不到这一点,但是函数组件可以!!!而为了使开发者可以更好的去编写函数式组件。React Hooks 应运而生!!

<1> React Hooks解决了哪些问题?

  • 复用组件之间的逻辑很难

      - 没有 hooks ,我们就只能利用高阶组件、render props等复用代码,但这有可能会造成"嵌套地域",而有了 hooks 的出现,我们就可以从组件中提取出状态逻辑,并进行单独测试和复用。
    
  • 复杂组件变得难以理解

        - 在类组件中,一个生命周期中可能包含多个不相关的逻辑,比如在 componentDidMount() 中我们可能要请求不同的数据,且需要做不同的处理。这就会导致代码逻辑不清晰,很容易出现 bug 。
        - 而使用了 hooks 后,hooks 中模拟的生命周期钩子,useEffect() 是可以定义多次的。所以我们就可以把不相关的逻辑放在不同的 useEffect() 中
    
  • 难以理解的 class

<2> 使用 Hooks 时需要注意的问题?

  • 不要在循环、条件或者嵌套函数中使用 Hooks

because Hooks 的设计是基于数组实现的【实质上 Hooks 的源码是基于链表实现的】,在定义时按顺序加入数组中,如果在循环、条件或者嵌套函数中使用,很可能会导致数组取值错位,而 React 需要利用调用顺序来正确的更新相应的状态,并调用相应的钩子函数。就会造成执行错误的 Hook 。

  • 在使用 useState() 的时候,不能用 push、pop、slice进行修改数组,在 setState() ,这样是拿不到最新值的,需要析构方式
let [num,setNums] = useState([1,2,3]);
num.push(4);
setNums(num);  // 错的,这样拿不到最新值

num = [...num , 1];
setNums(num);  // 正确的

二. Hooks 提供的生命周期钩子

2210.png