react开发者们,你们真的会用useEffect么?

你可能根本不需要useEffect这个钩子

useEffect主要用于当你想要同步React和第三方系统的时候,比如与Leaflet库同步,或者与localStorage、DOM同步。

用useEffect映射数据结果

有时我们会倾向于用useEffect来映射数据,但其实完全没有必要。下面是一个例子:

// 不需要这样做
useEffect(() => {
  setMappedResult(resultFromFetch.map((p) => p.name)); 
}, [resultFromFetch]);

// 可以直接这样写:
const mappedResult = resultFromFetch.map((p) => p.name);

这更简单直接。为了性能,也可以用useMemo:

const mappedResult = useMemo(() => resultFromFetch.map((p) => p.name), [resultFromFetch]); 

用useEffect合并state或props

下面是一个反例:

// 不需要这样
useEffect(() => {
  setFullName(`${firstName} ${lastName}`);
}, [firstName, lastName]);

// 直接合并展示:
const fullName = `${firstName} ${lastName}` ;

重置组件的全部state

有时需要重置一个组件的全部state,这时不应该使用useEffect,而是使用key属性强制重新渲染:

export default function App() {
  const [key, setKey] = useState(Math.random());
  const handleReset = () => {
    setKey(Math.random());
  };

  return (
    <div className="App">
      <StatefulComponent key={key} />

      <button type="button" onClick={handleReset}>
        Reset
      </button>
    </div>
  );
}

处理用户事件

用户事件比如点击、改变、输入等应该直接绑定到元素上,不需要通过useEffect。

订阅存储

对于需要订阅的外部存储,React提供了useSyncExternalStore钩子:

const subscribe = (callback) => {
  window.addEventListener("storage", callback);
  return () => {
    window.removeEventListener("storage", callback);
  };
};

const getSnapShot = () => {
  return localStorage.getItem("lang");
};
export default function App() {
  const language = useSyncExternalStore(subscribe, getSnapShot);

  const handleLanguage = () => {
    const newLang = language === "english" ? "spanish" : "english";
    localStorage.setItem("lang", newLang);

    dispatchEvent(new StorageEvent("storage", { key: "lang", newLang }));
  };

  return (
    <div className="App">
      <div>
        <span>Value: </span>
        {language}
      </div>
      <button type="button" onClick={handleLanguage}>
        Change Value
      </button>
    </div>
  );
}

它可以方便地分离订阅和获取更新值的逻辑。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今天也想MK代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值