reactjs - ReactHooks:存储值更改时调用回调
问题描述
我正在学习如何正确使用 ReactHooks。我遇到了如下所述的问题:
我正在使用来自第三方库的Nav 组件。我使用钩子的组件如下所示:
//using redux selector to get value from state
const { screenType } = useSelector((state: IStateStore) => ({
screenType: state.screenType
}));
// dummy use effect to see when store's screentype is being updated
React.useEffect(() => {
console.log("screentype in effect", screenType); //prints updated when store changes
}, [screenType]);
//onRender callback I pass to my third party component
const onRenderLink = (link: INavLink) => {
console.log("Screen Type inside :", screenType);//never gets executed after screentype updates
return (<>Hello</>);
};
return (
<Navigation
groups={[]}
onRenderLink={onRenderLink}
/>
</div>
);
};
我的问题是:
- 当我的组件呈现时,将调用 onRenderLink,它使用来自 store 的默认 screenType 值调用我的函数 onRenderLink。\
- 当 store 的 screenType 值发生变化时,我的 useEffect 挂钩会打印更新的值,但此时我无法重新调用我的 onRenderLink,因为它之前已经被调用过。
如何使 screenType 值更改以再次调用 onRenderLink?我试着做。
<Navigation
className="sectionTabs"
groups={[]}
onRenderLink={React.useCallback(onRenderLink, [screenType])}
/>
我想当 screenType 改变时,这会重新触发我的回调方法,但这不是正在发生的事情。谢谢你的帮助
解决方案
您需要使用useMemo钩子,因为您希望onRenderLink()
每次screenType
更改时都会被调用并返回一个值。
它应该以这种方式实现:
//using redux selector to get value from state
const { screenType } = useSelector((state: IStateStore) => state);
// dummy useEffect to see when store's screenType is being updated
useEffect(() => {
//prints updated screenType when store changes
console.log("screenType in useEffect", screenType);
}, [screenType]);
//onRenderLink gets invoked every time screenType updates and returns <>Hello</>
const onRenderLink = useMemo((link: INavLink) => {
//prints updated screenType when store changes
console.log("screenType in onRenderLink", screenType);
return (<>Hello</>);
},[screenType]) // need to pass screenType to dependency list
return (
<div>
<Navigation
groups={[]}
onRenderLink={onRenderLink}
/>
</div>
);
};
如果您需要任何进一步的解释,请告诉我:)
推荐阅读
- angular - 在 RxJS 管道中捕获完成
- php - Icecast歌曲历史
- php - 狮身人面像错误:“搜索请求中的未知本地索引”消息“
- javascript - 如何为所有fabricjs对象添加属性?
- tensorflow - 仅掩码 RCNN 1 类
- c++ - c ++将variadac函数参数转发给类构造函数
- pine-script - 高效的下不完全 Beta 函数
- discord - 我怎么能说哪个 Discord 成员是通过哪个邀请来的?
- css - 在方形网格中显示图像(React + Material UI Grid)
- python - 通过使用 python 提供包含图像的文件夹的路径,将多个图像添加到 word 文件