我有一些功能组件。在组件中我从redux存储中获取值(我使用redux工具包)。同时我在这个组件中有处理程序。
通过RTK查询向API发出请求后,存储中设置的变量值。因此,该变量首先具有默认值,然后更改为API中的值。
问题:redux存储中的变量值未在处理程序内更新。
const SomeContainer = () => {
const dispatch = useDispatch();
const variableFromStore = useSelector(someSelectors.variableFromStore);
console.log(variableFromStore)**// correct value (updated)**
const handleSomeAction = () => {
console.log(variableFromStore)**// default value of init store (not updated)**
};
return <SomeComponent onSomeAction={handleSomeAction} />;
};
某些组件
const SomeComponent = (props) => {
const { list, onSomeAction } = props;
const moreRef = useRef(null);
const loadMore = () => {
if (moreRef.current) {
const scrollMorePosition = moreRef.current.getBoundingClientRect().bottom;
if (scrollMorePosition <= window.innerHeight) {
onSomeAction(); // Call handler from Container
}
}
};
useEffect(() => {
window.addEventListener('scroll', loadMore);
return () => {
window.removeEventListener('scroll', loadMore);
};
}, []);
return (
...
);
};
怎么可能,我有什么不明白的?)
1条答案
按热度按时间41zrol4v1#
问题是您无意中创建了一个围绕原始版本
handleSomeAction
的闭包:此处的dependencies数组为空,这意味着此效果仅在组件第一次挂载时运行,因此在组件挂载时捕获
loadMore
的值(组件挂载时onSomeAction
本身捕获onSomeAction
值)。“简单的解决方法”是将
loadMore
指定为效果的依赖项:但是!这将产生一个新的问题-
handleSomeAction
在每个渲染上都被重新创建,所以你的效果现在也会在每个渲染上运行!因此,在不知道您 * 实际 * 尝试做什么的更多细节的情况下,我将使用
ref
来存储对onSomeAction
的引用,并将loadMore
内联到您的效果中: