文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Reac怎么摆脱hooks依赖烦恼

2023-06-15 02:29

关注

这篇文章主要介绍了Reac怎么摆脱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变成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依赖,但是又不会触发组件渲染,界面不更新。
如何解决?

可以将useRefuseState的特性结合起来,构造一个新的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,other2useRef的引用特性,不会触发doSomething不必要的执行。又有了useState的响应特性,改变.value的时候会触发组件渲染和界面更新。
我们想要变量改变触发doSomething的时候,就把watch.value加入依赖数组。我们只想引用值而不想其触发doSomething的时候,就把变量本身加入数组。

感谢你能够认真阅读完这篇文章,希望小编分享的“Reac怎么摆脱hooks依赖烦恼”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网行业资讯频道,更多相关知识等着你来学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯