一: 为什么要引入Hooks
(1)想要复用一个有状态的组件太麻烦了。react的核心思想:将一个页面拆成一堆独立的,可复用的组件,并且用自上而下的单项数据流的形式将这些组件串联起来。
但是大型项目中的react,项目中实际上很多react组件冗长且难以复用。尤其是写成class的组件,它们本身包含了状态(state),复用很麻烦
原来用:渲染属性 Render Props 和高阶组件解决;
痛处:会增加代码层级关系。
(2)生命周期钩子函数中逻辑太乱。通常希望一个函数只做一件事情,但是我们的生命周期钩子函数中通常做了很多事情。比如在componentDidMount中发起ajax请求获取数据,绑定一些事件监听等等。同时,有时候需要在componentDidUpdate做一遍同样的事情。当项目变复杂后,这一块代码也就变得不那么直观。
(3)class让人太困惑。this中的指向问题,以及很多时候用function写了一个简单完美的无状态组件,后来因为需求变动这个组件必须有自己的state,不得不把function改为class
二:Hooks是什么?
react新特性,即javaSript函数
Hook 这个单词的意思是"钩子"。
React Hooks 的意思是,组件尽量写成纯函数,如果需要外部功能和副作用,就用钩子把外部代码"钩"进来。 React Hooks 就是那些钩子。
三:Hooks解决了什么问题?
1.拥有hooks不需要写Class,所有组件都是Function,
2.拥有hooks,生命周期钩子函数可以放一边
3.this的指向问题将不存在
三:Hooks怎么用?
(1)State Hooks:声明状态变量。 useState这个函数接收的参数是我们的状态初始值(initial state),它返回了一个数组,这个数组的第 [0]项是当前当前的状态值,第 [1]项是可以改变状态值的方法函数。
react规定我们必须将hooks写在函数的最外层,不能写在if-else等条件语句中,来确保hooks的执行顺序一致。
(2)Effect Hooks:我们写有状态组件,通常会产生很多副作用(side effect),比如发起ajax请求获取数据,添加一些监听的注册和取消注册,手动修改dom等,我们之前都把这些副作用写在生命周期函数钩子里,比如componentDidMount、componentDidUpdate和componentWillUnmount。而现在的useEffect就相当于与这些声明周期函数钩子的集合体。
同时,hooks可以反复多次使用,相互独立,我们合理的做法就是,给每一个副作用一个单独的useEffect钩子。这样一来,这些副作用不再一股脑堆在生命周期钩子里,代码变得更加清晰。
注意:react首次渲染和之后的每次渲染都会调用一遍传给useEffect函数
useEffect中定义的副作用函数的执行不会阻碍浏览器更新试图,也就是这些函数是异步执行,原来的DidMount和DidUpdate同步执行。
解决:给useEffect传第二个参数即可解决每次渲染执行问题。用第二个参数来告诉react只有当这个参数的值发生改变时,才执行我们传的副作用函数。
四:Hooks原理是什么?
为什么useEffect第二个参数是空数组,相当于componentDidMount
因为依赖一直不变化,callback不会二次执行
1.为什么只能再函数最外层调用Hook?为什么不要在循环、条件判断或者子函数中调用
存放state的数组memoizedState是按照hook定义的顺序来放置数据的,如果hook顺序变化,memoizedState并不会感知到
2,。自定义Hook是如何影响使用它的组件的?
共享同一个memoizedState,共享同一个顺序
十个案例学会 React Hooks:https://github.com/happylindz/blog/issues/19
React Hooks 原理:https://github.com/brickspert/blog/issues/26