首页 > 解决方案 > React-在设置状态之前检查是否安装了 cmp

问题描述

我已经读过,如果获取数据的 useEffect 的依赖数组包含道具,那么使用包含清理函数的空数组创建一个新的 useEffect 是一种更好的做法,但我不知道为什么。 ..

为什么我不能在原始 useEffect (被评论的那个)中留下清理和保存到 isMountedRef ?我看到这个的方式,当一个道具发生变化时,它无论如何都会重新渲染,因此在重新安装和重新渲染之前,cmp 将在短时间内卸载,因此它应该在那里改变 isMountedRef,而不是在带有空依赖数组的单独 useEffect 中...

谢谢!

const EditItem = () => {
  const [isLoading, setIsLoading] = useState(true);
  const [menuItem, setMenuItem] = useState({});
  const isMountedRef = useRef(true);
  const params = useParams();

  useEffect(() => {
    (async () => {
      const data = await getMenuItem(params.menuItemId);
      const { id, price, inStock, quantity, description, item} = data;
      // if (isMountedRef.current) {
      setMenuItem({
        id,
        price: price.toFixed(2),
        inStock,
        quantity: quantity.toString(),
        description,
        item,
      });}();

    // return () => {
    //   isMountedRef.current = false;
    // };

  }, [params.menuItemId]);

  useEffect(() => {
    return () => {
      isMountedRef.current = false;
    };
  }, []);

标签: reactjsuse-effect

解决方案


推荐阅读