使用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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值