繁体   English   中英

Eslint hook 重构 useEffect

[英]Eslint hook refactor useEffect

我像这样创建 useEffect 。 我想要 useEffect 听 useToken ,当我登录并设置令牌时,它会获取一些数据

  useEffect(() => {
    if (userToken) {
      setTimeout(() => {
        fetchDataWishlistShow();
        fetchCart();
      }, 500);
    }
    fetchCategory();
  }, [userToken]);

但是 Eslint 的 hook 自动添加了一些 function 到 Effect

  useEffect(() => {
    if (userToken) {
      setTimeout(() => {
        fetchDataWishlistShow();
        fetchCart();
      }, 500);
    }
    fetchCategory();
  }, [fetchCart, fetchCategory, fetchDataWishlistShow, userToken]);

为什么这样做。 我认为这是错误的,但有人可以为我解释吗?

我猜你安装了“eslint-plugin-react-hooks”并启用它。

useEffect的设计方式与您在useEffect中使用的方式相同,建议您将其添加到依赖项数组列表中,除了一些 React 保证不会在每次重新渲染时更改的内容,例如:调度 useReducer、setState form const [state, setState] = useState()或从其他文件导入的函数或变量。

您可以关闭规则,但您不应该这样做,因为您没有解决问题的根源。 例如

const [cartStatus, setCartState] = useState("all") // assume it can be "all", "pending"

const fetchCart = () =>{
   fetch(`endpoint/cart/${cardStatus}`)
}

useEffect(() => {
    if (userToken) {
      setTimeout(() => {
        fetchDataWishlistShow();
        fetchCart();
      }, 500);
    }
    fetchCategory();
    // This case you alway fetch all item in cart
  }, [userToken]);

要解决上面说的问题,是的,我们可以将fetchCart添加到依赖项列表中,但这会导致无限重新渲染,您需要通过 useCallback 包装fetchCart或将fetchCart移动到useEffect 因为您在 setTimeout 中调用了 function,所以您可能需要清理useEffect

const [cartStatus, setCartState] = useState("all") // assume it can be "all", "pending"


useEffect(() => {
   const fetchCart = () =>{
     fetch(`endpoint/cart/${cardStatus}`)
   }
   let id = null
    if (userToken) {
      id = setTimeout(() => {
        fetchDataWishlistShow();
        fetchCart();
      }, 500);
    }
    fetchCategory();
    return () => clearTimeout(id);  
  }, [userToken]);

本文由 Dan Abramov 撰写,是一个很好的资源,可以查看并深入了解useEffect工作原理以及为什么应该遵循推荐的方式。

您可能会说“不不,我只有在安装组件时调用 api,就是这样”。 但是当你的项目变大,你的组件变得复杂时,很难记住,谁知道你的需求在未来的某个时候可能会改变,为什么不以正确的方式去做,让你在重构或重构时更有信心更新你的组件?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM