设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 重新 试卷 文件
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

【React深入】从Mixin到HOC再到Hook(13)

发布时间:2019-04-11 17:31 所属栏目:21 来源:ConardLi
导读:注意,如果加上浏览器渲染的情况,结果应该是这样的: 页面渲染...1 执行...1 页面渲染...2 清理...1 执行...2 页面渲染...3 清理...2 执行...3 页面渲染...4 清理...3 执行...4 那么为什么在浏览器渲染完后,再执

注意,如果加上浏览器渲染的情况,结果应该是这样的:

  1. 页面渲染...1  
  2.  执行... 1  
  3.  页面渲染...2  
  4.  清理... 1  
  5.  执行... 2  
  6.  页面渲染...3  
  7.  清理... 2  
  8.  执行... 3  
  9.  页面渲染...4  
  10.  清理... 3  
  11.  执行... 4 

那么为什么在浏览器渲染完后,再执行清理的方法还能找到上次的state呢?原因很简单,我们在useEffect中返回的是一个函数,这形成了一个闭包,这能保证我们上一次执行函数存储的变量不被销毁和污染。

你可以尝试下面的代码可能更好理解 

  1. var flag = 1;  
  2.     var clean;  
  3.     function effect(flag) {  
  4.       return function () {  
  5.         console.log(flag);  
  6.       }  
  7.     }  
  8.     clean = effect(flag);  
  9.     flag = 2;  
  10.     clean();  
  11.     clean = effect(flag);  
  12.     flag = 3;  
  13.     clean();  
  14.     clean = effect(flag);  
  15.     // 执行结果  
  16.     effect... 1  
  17.     clean... 1  
  18.     effect... 2  
  19.     clean... 2  
  20.     effect... 3 

模拟componentDidMount

componentDidMount等价于useEffect的回调仅在页面初始化完成后执行一次,当useEffect的第二个参数传入一个空数组时可以实现这个效果。

  1. function useDidMount(callback) {  
  2.   useEffect(callback, []);  

官方不推荐上面这种写法,因为这有可能导致一些错误。

模拟componentWillUnmount

  1. function useUnMount(callback) {  
  2.   useEffect(() => callback, []);  

不像 componentDidMount 或者 componentDidUpdate,useEffect 中使用的 effect 并不会阻滞浏览器渲染页面。这让你的 app 看起来更加流畅。

ref Hook

使用useRef Hook,你可以轻松的获取到dom的ref。

  1. export default function Input() {  
  2.   const inputEl = useRef(null);  
  3.   const onButtonClick = () => {  
  4.     inputEl.current.focus();  
  5.   };  
  6.   return (  
  7.     <div>  
  8.       <input ref={inputEl} type="text" />  
  9.       <button onClick={onButtonClick}>Focus the input</button>  
  10.     </div>  
  11.   );  

注意useRef()并不仅仅可以用来当作获取ref使用,使用useRef产生的ref的current属性是可变的,这意味着你可以用它来保存一个任意值。

模拟componentDidUpdate

componentDidUpdate就相当于除去第一次调用的useEffect,我们可以借助useRef生成一个标识,来记录是否为第一次执行:

  1. function useDidUpdate(callback, prop) {  
  2.   const init = useRef(true);  
  3.   useEffect(() => {  
  4.     if (init.current) {  
  5.       init.current = false;  
  6.     } else {  
  7.       return callback();  
  8.     }  
  9.   }, prop);  

使用Hook的注意事项

使用范围

  •  只能在React函数式组件或自定义Hook中使用Hook。

Hook的提出主要就是为了解决class组件的一系列问题,所以我们能在class组件中使用它。

声明约束

  •  不要在循环,条件或嵌套函数中调用Hook。

Hook通过数组实现的,每次 useState 都会改变下标,React需要利用调用顺序来正确更新相应的状态,如果 useState 被包裹循环或条件语句中,那每就可能会引起调用顺序的错乱,从而造成意想不到的错误。

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读