如何正确初始化与 redux 状态交互的函数?
How do I correctly initialize a function which interacts with the redux state?
假设我有以下函数,其中 returns 来自状态的文件路径,基于文件名(作为输入参数),如果它不存在 returns 和 URL 来自服务器。
const getFilepath = (state: IRootState) => (url: string) => {
const file = getFilenameByURL(state, url);
return file ? file : getRemoteFilePath(url);
}
现在我有一个组件 FileBrowser
,它有一个文件名列表。在这里,我想初始化这个函数。目前我会这样做:
const { getFilepathByFilename } = useSelector((state: IRootState) => ({ getFilepathByFilename: getFilepath(state)}))
现在,当我想从列表中的元素访问路径时,我会这样做:
const filePath = getFilepathByFilename(fileName)
现在这似乎可行,但我 运行 进入了一个无限的重新渲染循环,因为 FileBrowser
中的 getFilepath
函数被一遍又一遍地设置。
我觉得我在这里实施了错误的模式。我将如何创建一个访问状态但不会导致无限重新渲染的函数?感谢您的帮助!
要在组件重新渲染期间保留函数引用,您可以使用 useCallback,如下所示:
const getFilepath = useCallback ((state: IRootState) => (url: string) => {
const file = getFilenameByURL(state, url);
return file ? file : getRemoteFilePath(url);
}, [])
假设我有以下函数,其中 returns 来自状态的文件路径,基于文件名(作为输入参数),如果它不存在 returns 和 URL 来自服务器。
const getFilepath = (state: IRootState) => (url: string) => {
const file = getFilenameByURL(state, url);
return file ? file : getRemoteFilePath(url);
}
现在我有一个组件 FileBrowser
,它有一个文件名列表。在这里,我想初始化这个函数。目前我会这样做:
const { getFilepathByFilename } = useSelector((state: IRootState) => ({ getFilepathByFilename: getFilepath(state)}))
现在,当我想从列表中的元素访问路径时,我会这样做:
const filePath = getFilepathByFilename(fileName)
现在这似乎可行,但我 运行 进入了一个无限的重新渲染循环,因为 FileBrowser
中的 getFilepath
函数被一遍又一遍地设置。
我觉得我在这里实施了错误的模式。我将如何创建一个访问状态但不会导致无限重新渲染的函数?感谢您的帮助!
要在组件重新渲染期间保留函数引用,您可以使用 useCallback,如下所示:
const getFilepath = useCallback ((state: IRootState) => (url: string) => {
const file = getFilenameByURL(state, url);
return file ? file : getRemoteFilePath(url);
}, [])