使用useRef解决useState更新state不及时的问题

  1. useState的值在每个rernder中都是独立存在的。而useRef.current则更像是相对于render函数的一个全局变量,每次他会保持render的最新状态。
  2. useState值的更新会触发组件重新渲染,而useRef的current不会出发重渲染。
  3. useRef()钩不仅用于DOM引用。“ ref”对象是通用容器,其当前属性是可变的,并且可以保存任何值,类似于类的实例属性。
  4. 变量是决定视图图层渲染的变量,请使用useState,其他用途useRef
  5. useRef特性:可变的ref对象,持久化

链接:useRef和useState比较

React项目中,通常使用useState的钩子函数更新state,

但是在useEffect中 使用useState更新state不会立马更新到state,而是等useEffect执行完毕?以后才会统一处理更新(写多个useEffect也没用),如果要在useEffect中立即拿到更新后的state值,可以使用useRef这个钩子函数。

const [filterData, setFilterData] = useState<any>([]);
  const [total, setTotal] = useState<number>(0);
  let studentGuid = useRef<string | null>(window.sessionStorage.getItem("sGuid"));
  const [studentInfo, setstudentInfo] = useState<StudentInfo>({});
  const [currentPath, setCurrentPath] = useState<string | null>(window.sessionStorage.getItem("current_path"));
  const [isHideInfo, setIsHideInfo] = useState<boolean>(false);

  const { urls } = props;
  const intl = useIntl();
  useEffect(() => {
    window.addEventListener('SwitchStudent', (evt: Event): void => {
      const e = evt as CustomEvent;
      if (e == null) {
        console.log('Invalid event type!');
        return;
      }

      const { param } = e.detail;
      if (param) {
        window.sessionStorage.setItem("sGuid", param);
        studentGuid = param;
      }
    }, false);

    window.addEventListener('Clear', (evt: Event): void => {
      const e = evt as CustomEvent;
      if (e == null) {
        console.log('Invalid event type!');
        return;
      }

      studentGuid ="" ;
    }, false);

    window.addEventListener('SwitchCurrentPath', (evt: Event): void => {
      const e = evt as CustomEvent;
      if (e == null) {
        console.log('Invalid event type!');
        return;
      }

      const { param } = e.detail;

      if (param) {
        window.sessionStorage.setItem("current_path", param);
        setCurrentPath(param);
      }
    }, false);

    window.addEventListener('UpdateStudentInfo', (evt: Event): void => {
      const e = evt as CustomEvent;
      if (e == null) {
        console.log('Invalid event type!');
        return;
      }
      if (!studentGuid) {    //HERE
        return;
      }
      queryStudentInfoByGuid(studentGuid).then((result) => {
        setStudentInfo(result);
      });
    }, false);
    queryStudentCard();
    queryHideInfo();
  }, []);

在此副作用函数中,如果不是使用useRef,而是在SwitchStudent事件监听器中使用useState对studentGuid更新,那么在UpdateStudentInfo事件监听器中拿到的studentGuid将会始终是null,也就不会执行后面的 queryStudentInfoByGuid()。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: useState 是 React 提供的 Hooks 之一,用于在函数组件中添加状态(state)。每次调用 useState 都会返回当前的 state 和一个更新 state 的函数,通过调用这个函数更新 state 值。 useRef 也是 React 提供的 Hooks 之一,用于在函数组件中绑定 DOM 元素或者其他值。useRef 返回一个可变的 ref 对象,可以将 ref 对象绑定到函数组件中的任何值上,并在组件的生命周期中保持不变。 因此,useState 用于管理组件的状态,而 useRef 用于获取 DOM 元素或者其他值的引用,以便在组件的生命周期中进行访问和修改。 ### 回答2: useStateuseRef是React Hook中两个常用的Hook,它们被用来管理和更新组件的状态。 useState是一种用于声明并更新组件状态的Hook。它返回一个由当前状态和更新状态函数组成的数组,可以使用解构赋值的方式对其进行操作。通过调用更新状态函数,可以触发组件的重新渲染。每次重新渲染时,useState会返回最新的状态值,并在组件中保存状态的变化。因此,useState在每次重新渲染时都会重新计算,适合用于保存会频繁发生变化的数据。 与之相反,useRef是一种用于保存和获取持久引用值的Hook。它返回一个可变的ref对象,该对象有一个current属性,可以用来存储和访问持久引用值。与useState不同,useRef的改变不会触发组件的重新渲染,因此可以用来保存那些在更新时不需要重新计算的值。另外,useRef还可以通过使用ref.current获取最新的值,而无需重新渲染组件。这对于保存组件的上一次状态或某个DOM元素的引用等场景非常有用。 总结来说,useStateuseRef使用上的区别可以总结为: 1. useState用于保存会频繁发生变化的状态数据,并触发组件的重新渲染; 2. useRef用于保存无需重新计算的值,不会触发组件的重新渲染,并可通过ref.current获取最新值。 需要根据具体的场景和需求来选择使用不同的Hook,从而更好地管理组件的状态。 ### 回答3: useRefuseState是React中的两种不同的Hook,它们有一些关键的区别。 首先,useState是用来管理组件内部状态的。它返回一个状态值和一个更新状态的函数。当状态值发生改变时,组件会重新渲染。使用useState可以在函数组件中保存和更新状态,可用于处理一般的状态操作。 相比之下,useRef用于在函数组件中保存和访问引用值。它返回一个可变的ref对象,可以在组件的整个生命周期中保持引用值的稳定。ref对象中的current属性可以被读取和修改,而不会导致组件重新渲染。主要应用于存储和访问DOM节点的引用,或在两次渲染之间共享数据。 其次,useState返回的是一个包含当前状态的数组,而useRef返回的是一个包含ref对象的可变引用。useState可以直接通过解构来获取状态值和更新函数,而useRef则需要通过ref.current来访问引用值。 最后,useState每次渲染都会返回一个新的状态值和更新函数,而useRef永远返回相同的ref对象,只有当ref对象的current属性改变时才会触发组件重新渲染。 总而言之,useState主要用于处理组件状态的变化,并触发重新渲染,而useRef则用于在函数组件中保存和访问引用值,并且不会触发重新渲染。两者在使用场景和目的上有所不同,可以根据具体情况选择使用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值