在react稳定版本中使用useEffectEvent

react 新发布的版本18.2.0 中新增了experimental_useEffectEvent

       useEffectEvent的用法?点这里:Separating Events from Effects – React用于构建 Web 和原生交互界面的库icon-default.png?t=N4P3https://zh-hans.react.dev/learn/separating-events-from-effects

但目前experimental_useEffectEvent 还在 建设中,在react的稳定版本中还没办法使用,

官网给的解决方案是,将稳定react 稳定版本升级成实验版本。

我新建了一个项目将react包升级成实验版本后,发现在项目中仍然没法使用,而且还新出来更多的问题,so,项目中别轻易尝试。

 最后的解决方案是:自己写一个 自定义Hook函数 useEffectEvent() 代替,话不多说,上代码:

  useEffectEvent.tsx

import { useRef } from 'react';

export default function useEffectEvent(callback) {
  const fn = useRef(null);

  fn.current = callback;

  return () => {
    fn.current();
  };
}

    Timer.tsx

'use client';
import { useState, useEffect } from 'react';
import useEffectEvent from './useEffectEvent';

export default function Timer() {
  const [count, setCount] = useState(0);
  const [delay, setDelay] = useState(100);

  const onTick = useEffectEvent(() => {
    setCount((c) => c + 1);
  });

  useEffect(() => {
    const id = setInterval(() => {
      onTick();
    }, delay);
    return () => {
      clearInterval(id);
    };
  }, [delay]);

  return (
    <>
      <p>count:{count}</p>
      <p>
        Increment delay:
        <button
          disabled={delay === 100}
          onClick={() => {
            setDelay((d) => d - 100);
          }}
        >
          –100 ms
        </button>
        <b>{delay} ms</b>
        <button
          onClick={() => {
            setDelay((d) => d + 100);
          }}
        >
          +100 ms
        </button>
      </p>
    </>
  );
}

    Timer.tsx 运行截图

 

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值