【问题标题】:Hook doesn't rerender componentHook 不会重新渲染组件
【发布时间】:2019-10-05 10:50:22
【问题描述】:

我正在将 React 与 React-Router-Dom 一起使用,但我不知道为什么我的子组件(功能组件)在 URL 更改时不会重新呈现。而且我不知道为什么,当我第一次访问动态页面时,console.log(url)fired 3 次?

我的子组件:

import React from "react";
import { useFetch } from "./hooks";

function Page(props) {
  const url = "https://jsonplaceholder.typicode.com/posts" + props.match.url;
  console.log(url);

  const [data, loading] = useFetch(url);

  return (
    <>
      {loading ? (
        "Loading..."
      ) : (
        <>
          <h1>{data.title}</h1>
          <p>{data.body}</p>
        </>
      )}
    </>
  );
}
export default Page;

这里提供了一个沙盒以获得更完整的示例:https://codesandbox.io/embed/great-mahavira-5ktrk

【问题讨论】:

    标签: reactjs components render react-hooks


    【解决方案1】:

    您的子组件会重新渲染,但它会使用上一次渲染中的旧数据。发生这种情况是因为您没有将url 作为useEffect 挂钩中的依赖项传递。并且最好将fetchUrl 函数移到useEffect 中(如果你不想在其他地方使用它),因为现在eslint 会报错:

    React Hook useEffect 缺少一个依赖项:'fetchUrl'。包括它或删除依赖数组。 (react-hooks/exhaustive-deps)

    它应该是这样的:

    function useFetch(url) {
      const [data, setData] = useState([]);
      const [loading, setLoading] = useState(true);
    
      useEffect(() => {
        async function fetchUrl() {
          const response = await fetch(url);
          const json = await response.json();
          setData(json);
          setLoading(false);
        }
    
        fetchUrl();
      }, [url]);
      return [data, loading];
    }
    
    

    “而且我不知道为什么,当我第一次访问动态页面时,console.log(url)触发了3次?”

    发生这种情况是因为您的组件重新渲染了 3 次:

    1. 安装时。

    2. 当你的钩子调用setData(json)时。

    3. 当你的钩子调用setLoading(false)时。

    这里的工作示例:https://codesandbox.io/embed/condescending-wildflower-v8m4c

    【讨论】:

    • 感谢您提供这个非常有启发性的答案@andrii
    • 我遇到了完全相同的问题,但是在我的 fetchData 中,我直接传递了 fetch 函数(作为 'fetchFunction',在这个例子中替换了 'fetch(url)')。如果我将 fetchFunction 函数放在依赖数组中,那么它会创建一个无限循环。有没有办法做到这一点?
    • @Cedo 你可以使用useMemo 挂钩来存储你的fetchFunction。这里是一个例子(看useFetchVersion2codesandbox.io/embed/angry-mcclintock-zvvbq
    • @AndriiGolubenko 谢谢。这就是我所做的,但是使用了 useCallback。它修复了无限循环。
    猜你喜欢
    • 2020-06-12
    • 2020-02-13
    • 1970-01-01
    • 2020-04-18
    • 2018-09-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多