reacthooks基础使用(React 小技巧教你如何摆脱hooks依赖烦恼)
类别:编程学习 浏览量:2993
时间:2022-03-31 19:15:46 reacthooks基础使用
React 小技巧教你如何摆脱hooks依赖烦恼react
项目中,很常见的一个场景:
const [watchValue, setWatchValue] = useState(''); const [otherValue1, setOtherValue1] = useState(''); const [otherValue2, setOtherValue2] = useState(''); useEffect(() => { doSomething(otherValue1, otherValue2); }, [watchValue, otherValue1, otherValue2]);
我们想要watchValue
改变的时候执行doSomething
,里面会引用其他值otherValue1
, otherValue2
。
这时有个让人烦恼的问题:
- 如果不把
otherValue1
,otherValue2
加入依赖数组的话,doSomething
里面很可能会访问到otherValue1
,otherValue2
旧的变量引用,从而发生意想不到的错误(如果安装hooks
相关eslint
的话,会提示警告)。 - 反之,如果把
otherValue1
,otherValue2
加入依赖数组的话,这两个值改变的时候doSomething
也会执行,这并不是我们想要的(我们只想引用他们的值,但不想它们触发doSomething
)。
把otherValue1
, otherValue2
变成ref
可以解决这个问题:
const [watchValue, setWatchValue] = useState(''); const other1 = useRef(''); const other2 = useRef(''); // ref可以不加入依赖数组,因为引用不变 useEffect(() => { doSomething(other1.current, other2.current); }, [watchValue]);
这样other1
, other2
的变量引用不会变,解决了前面的问题,但是又引入了一个新的问题:other1
, other2
的值current
改变的时候,不会触发组件重新渲染(useRef的current
值改变不会触发组件渲染),从而值改变时候界面不会更新!
这就是hooks
里面的一个头疼的地方,useState
变量会触发重新渲染、保持界面更新,但作为useEffect
的依赖时,又总会触发不想要的函数执行。useRef
变量可以放心作为useEffect
依赖,但是又不会触发组件渲染,界面不更新。
如何解决?
可以将useRef
和useState
的特性结合起来,构造一个新的hooks
函数: useStateRef
。
import { useState, useRef } from "react"; // 使用 useRef 的引用特质, 同时保持 useState 的响应性 type StateRefObj<T> = { _state: T; value: T; }; export default function useStateRef<T>( initialState: T | (() => T) ): StateRefObj<T> { // 初始化值 const [init] = useState(() => { if (typeof initialState === "function") { return (initialState as () => T)(); } return initialState; }); // 设置一个 state,用来触发组件渲染 const [, setState] = useState(init); // 读取value时,取到的是最新的值 // 设置value时,会触发setState,组件渲染 const [ref] = useState<StateRefObj<T>>(() => { return { _state: init, set value(v: T) { this._state = v; setState(v); }, get value() { return this._state; }, }; }); // 返回的是一个引用变量,整个组件生命周期之间不变 return ref; }
这样,我们就能这样用:
const watch = useStateRef(''); const other1 = useStateRef(''); const other2 = useStateRef(''); // 这样改变值:watch.value = "new"; useEffect(() => { doSomething(other1.value, other2.value); // 其实现在这三个值都是引用变量,整个组件生命周期之间不变,完全可以不用加入依赖数组 // 但是react hooks的eslint插件只能识别useRef作为引用,不加人会警告,为了变量引用安全还是加入 }, [watch.value, other1, other2]);
这样,watch, other1
,other2
有useRef
的引用特性,不会触发doSomething
不必要的执行。又有了useState
的响应特性,改变.value
的时候会触发组件渲染和界面更新。
我们想要变量改变触发doSomething
的时候,就把watch.value
加入依赖数组。我们只想引用值而不想其触发doSomething
的时候,就把变量本身加入数组。
以上就是React 小技巧教你如何摆脱hooks依赖烦恼的详细内容,更多关于React hooks依赖的资料请关注开心学习网其它相关文章!
您可能感兴趣
- react绑定详解(React列表栏及购物车组件使用详解)
- yii2对比springboot(yii2.0框架使用 beforeAction 防非法登陆的方法分析)
- reactnative零基础入门到项目实战(用React Native制作一个简单的游戏引擎)
- react的基本知识(React中refs的一些常见用法汇总)
- react组件分析(react-diagram 序列化Json解读案例分析)
- react native常用组件(react native环境安装流程)
- react常用设计模式(提高React界面性能的十个技巧)
- react组件封装成函数方法(React虚拟列表的实现)
- react app框架(浅谈React原生APP更新)
- react事件绑定的方式和区别(react合成事件与原生事件的相关理解)
- react 查看word文件(React实现导入导出Excel文件)
- react 使用实例(React+高德地图实时获取经纬度,定位地址)
- react执行流程(React开启代理的2种实用方式)
- vscode react插件(基于visual studio code + react 开发环境搭建过程)
- react动态创建菜单并实现局部刷新(使用react-virtualized实现图片动态高度长列表的问题)
- vue中的ref(Vue3.0中Ref与Reactive的区别示例详析)
- 这8种耐阴植物,营造阴生植物花境,也是一个不错的选择(营造阴生植物花境)
- 览邦G08 Plus SMART WATCH 测评⑱ 全独立这才是智能手表该有的样子(览邦G08PlusSMART)
- 荣耀手表 GS 3 真机亮相 不支持无线充电(荣耀手表GS3)
- 通过体温就能为智能手表充电 原来是用NASA在空间站用的黑科技(通过体温就能为智能手表充电)
- 智能手表兼容Windows和Android 无需充电挑战苹果(智能手表兼容Windows和Android)
- 一天一冲也算表 麦步,一款待机 21 天的智能手表体验评测(一天一冲也算表)
热门推荐
- aspx页面无任何代码 每个页面发布成dll
- python算法图解(python实现kmp算法的实例代码)
- Js如何判断浏览器类型和版本
- mysql面试题及答案100题(几个MySQL高频面试题的解答)
- nginx安全设置(Nginx+ModSecurity安全模块部署的实现)
- linux如何设置sudo授权(如何在Linux环境为用户添加sudo权限)
- 织梦列表页调用文章简介不显示(织梦文章系统修改专题文章列表的模板的方法)
- <i>和<em>、<b>和<strong>的区别
- python零基础实战项目(十个Python练手的实战项目,学会这些Python就基本没问题了推荐)
- sql server 锁超时(详解SQL Server中的事务与锁问题)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9