当年刚学 React 的时候,天天对着 Class 组件里的 this.bind() 和一堆长得要死、执行顺序玄学的生命周期函数发愁。后来 React 出了 Hooks,整个世界都清净了,再也不用去猜 this 到底指向谁了。
现在写新项目基本都是全盘函数式组件(Functional Component)。这里把最常用的几个 Hook 整理一下,方便自己抄代码。
1. useState:存数据的独苗
取代了以前的 this.state。
1 | import React, { useState } from 'react' |
小坑提醒:如果要存个大对象(比如表单),改的时候千万记得把原来的属性解构(...prev)塞回去,useState 不像以前那样会自动帮你合并对象了。
2. useEffect:缝合怪生命周期
这玩意儿统一把 componentDidMount、更新和卸载全缝合在一起了,主要用来发请求、绑事件。
1 | import React, { useState, useEffect } from 'react' |
3. useContext:拯救 Props 嵌套地狱
组件嵌套太深,传个数据要穿过祖宗十八代,太累了。有了 Context,直接隔空传功:
1 | import React, { createContext, useContext, useState } from 'react' |
4. useRef:不管怎么刷都不变的值
有两个用处:一是绑定真实的 DOM(像以前的 document.getElementById),二是存一个无论组件怎么刷新,它的值都不会被重置的变量,而且它变了不会触发页面刷新。
1 | function TextInput() { |
5. useMemo & useCallback:性能优化的药膏
这两个只有在页面觉得卡的时候才需要加,没事干全加上反而会拖慢初始化速度。
useMemo(用来记计算结果)
如果有个特别复杂的 for 循环计算,不想每次渲染页面都算一次:
1 | function ProductList({ products, filterWord }) { |
useCallback(用来记函数)
主要是配合 React.memo,防止每次刷新都生成一个新函数传给子组件,导致子组件无辜跟着刷新。
1 | // 只要依赖不变,这个函数在内存里的地址就永远一样 |
6. 自定义 Hook:最强装逼利器
把一堆逻辑抽出去写成一个 useXxx 的函数,代码立马变得清爽无比。比如我想自己封装个一键拿本地缓存的钩子:
1 | // hooks/useLocalStorage.js |
现在基本就靠着 useState 和 useEffect 这两把刷子走天下了。偶尔搞点自定义 Hook 骗骗代码行数,比以前 Class 组件清爽太多了。
评论加载中…