`useCallback` 里面有类似 `useRef.current` 的东西来确保调用总是使用最新版本的回调吗?
does `useCallback` have something like a `useRef.current` inside it that will ensure that calls always use the latest version of the callback?
我有一种情况,我正在加载多个数据集;用户可以选择加载多少。所有数据集都呈现在同一个图表上。数据集单独和异步加载。
代码类似于
export const DatasetGraph = ({userSelections}) => {
const [datasets, setDatasets] = useState({});
// when a selection changes, update the data
useEffect(() => {
// while loading a dataset, it is visible but has no data
setDatasets(userSelections.map(selec => ({ dsname: [] })));
// trigger asynchronous loads for each new dataset
userSelections.forEach((dsname) => fetchDataset(dsname));
}, [userSelections]);
const fetchDataset = async (dsname) => {
response = await fetch(url + dsname);
// QUESTION: after the await, will this call the most recent version of
// the callback? Will it use the most recent datasets object or an old
// one saved in the useCallback closure?
updateDataset(dsname, response);
};
// when a fetch returns, update the empty placeholder with the real data
const updateDataset = useCallback(
// For this toy example, we could use a setState function to always
// retrieve the latest `datasets`. However, this callback may use other
// state which is really what this question is about.
(dsname, response) => setDatasets({ ...datasets, dsname: response }),
[datasets]
);
return <Graph data={datasets}></Graph>;
};
我还没有尝试让每个数据集成为一个不向 DOM 呈现任何内容的 React 组件,然后它可以管理自己的加载状态。这实际上可能更容易。
useCallback
使用 dependencies
数组检测变化
useCallback
方法使用您传递给它的 dependencies
数组来记住函数的值。每次都会重新创建您的函数,但不会分配给 updateDataset
,除非 dependencies
之一已更改。
你应该小心使用 useCallback
除非你的功能下面的组件重新渲染是昂贵的,否则,useCallback
不会对你的应用程序的性能产生太大的积极影响,即使有任何积极的影响完全没有效果。
它的工作方式与 useMemo
相同,以确保您的数据(在 useCallback
的情况下是一个函数)仅在变量所依赖的内容发生更改时才在您的变量上更新.
我有一种情况,我正在加载多个数据集;用户可以选择加载多少。所有数据集都呈现在同一个图表上。数据集单独和异步加载。
代码类似于
export const DatasetGraph = ({userSelections}) => {
const [datasets, setDatasets] = useState({});
// when a selection changes, update the data
useEffect(() => {
// while loading a dataset, it is visible but has no data
setDatasets(userSelections.map(selec => ({ dsname: [] })));
// trigger asynchronous loads for each new dataset
userSelections.forEach((dsname) => fetchDataset(dsname));
}, [userSelections]);
const fetchDataset = async (dsname) => {
response = await fetch(url + dsname);
// QUESTION: after the await, will this call the most recent version of
// the callback? Will it use the most recent datasets object or an old
// one saved in the useCallback closure?
updateDataset(dsname, response);
};
// when a fetch returns, update the empty placeholder with the real data
const updateDataset = useCallback(
// For this toy example, we could use a setState function to always
// retrieve the latest `datasets`. However, this callback may use other
// state which is really what this question is about.
(dsname, response) => setDatasets({ ...datasets, dsname: response }),
[datasets]
);
return <Graph data={datasets}></Graph>;
};
我还没有尝试让每个数据集成为一个不向 DOM 呈现任何内容的 React 组件,然后它可以管理自己的加载状态。这实际上可能更容易。
useCallback
使用 dependencies
数组检测变化
useCallback
方法使用您传递给它的 dependencies
数组来记住函数的值。每次都会重新创建您的函数,但不会分配给 updateDataset
,除非 dependencies
之一已更改。
你应该小心使用 useCallback
除非你的功能下面的组件重新渲染是昂贵的,否则,useCallback
不会对你的应用程序的性能产生太大的积极影响,即使有任何积极的影响完全没有效果。
它的工作方式与 useMemo
相同,以确保您的数据(在 useCallback
的情况下是一个函数)仅在变量所依赖的内容发生更改时才在您的变量上更新.