当状态没有改变时,如何在我的反应组件中重新触发自定义钩子?

Sad*_*ara 0 reactjs react-hooks react-custom-hooks

我有一个用于从服务器获取数据的自定义挂钩。它有3个参数,分别是pageNumber、pageSize和keyword。据我所知,如果我设置一个或多个这些参数,挂钩就会以新状态重新触发。但是在我的组件中,有一个地方当我创建数据时,所以一旦创建它就必须再次获取数据。但其参数(如 pageNumber、pageSize 和 keywords)均未更新。我只需要它再次运行以获取新数据。在不改变状态的情况下,我该如何做到这一点?(在下面的代码中,“Adapter”是一个 Axios 实例)

这是钩子:

const useFetchLists = (
  url = '',
  currentPage = 1,
  selectedPageSize = 10,
  keyword = ''
) => {
  const [items, setItems] = useState([]);
  const [loading, setloading] = useState(false);
  const [totalPage, setTotalPage] = useState(1);
  const [totalItemCount, setTotalItemCount] = useState(0);

  useEffect(() => {
    const fetchListData = async () => {
      try {
        setloading(true);
        await Adapter.get(
          `${url}?pageNumber=${currentPage}&pageSize=${selectedPageSize}&keyword=${keyword}`,
          {}
        ).then((response) => {
          setItems(response.data.items);
          setTotalPage(response.data.totalPages);
          setTotalItemCount(response.data.totalItems);
        });
      } catch (err) {
      } finally {
        setloading(false);
      }
    };
    fetchListData();
  }, [url, currentPage, selectedPageSize, keyword]);

  return [items, loading, totalPage, totalItemCount];
};

export default useFetchLists;

Run Code Online (Sandbox Code Playgroud)

这就是我在页面初始加载时在组件中使用它的方式。

 const [currentPage, setCurrentPage] = useState(1);
  const [selectedPageSize, setSelectedPageSize] = useState(10);
  const [keyword, setKeyword] = useState('');
  const [items, loading, totalPage, totalItemCount] = useFetchLists(
    ADD_BRAND_URL,
    currentPage,
    selectedPageSize,
    keyword
  );
Run Code Online (Sandbox Code Playgroud)

我希望能够重新触发挂钩,而不设置其任何状态,因为它们没有更改,但数据已更改,因此必须再次获取。

小智 5

我认为你可以引入一个重新获取功能,如下所示:

const useFetchLists = (
  url = "",
  currentPage = 1,
  selectedPageSize = 10,
  keyword = ""
) => {
  const [items, setItems] = useState([]);
  const [loading, setloading] = useState(false);
  const [totalPage, setTotalPage] = useState(1);
  const [totalItemCount, setTotalItemCount] = useState(0);

  const fetchListData = useCallback(async () => {
    try {
      setloading(true);
      await Adapter.get(
        `${url}?pageNumber=${currentPage}&pageSize=${selectedPageSize}&keyword=${keyword}`,
        {}
      ).then((response) => {
        setItems(response.data.items);
        setTotalPage(response.data.totalPages);
        setTotalItemCount(response.data.totalItems);
      });
    } catch (err) {
    } finally {
      setloading(false);
    }
  }, [url, currentPage, selectedPageSize, keyword]);

  useEffect(() => {
    fetchListData();
  }, [fetchListData]);

  return {
    data: [items, loading, totalPage, totalItemCount],
    refetch: fetchListData
  };
};

export default useFetchLists;
Run Code Online (Sandbox Code Playgroud)