所以我试图访问一个通常应该更新的道具 我可以使用我的 redux devTools 查看商店,并且可以确认它已更新。 但是当我在我的组件中的一个函数内时,由于某种原因,props 似乎保持了它的初始值
const mapStateToProps = ({ repos, page }) => ({
repos,
page // page is 1 then gets updated in the store to 2
});
const mapDispatchToProps = dispatch => {
return {
getData: (page, dateString) => dispatch(getData(page, dateString))
};
};
const ConnectedRepositoryList = ({
alertOnBottom,
page, // after updated in the store the component re-renders and page is 2
getData,
repos
}) => {
const loadRepos = () => {
const date = new Date();
date.setDate(date.getDate() - 30);
const dateString = date.toISOString().split("T")[0];
getData(page, dateString); // here page is still 1 :(
};
useEffect(() => {
loadRepos();
}, []);
const handleOnDocumentBottom = useCallback(() => {
console.log("I am at bottom! ");
loadRepos();
if (alertOnBottom) {
alert('Bottom hit! Too slow? Reduce "debounce" value in props');
}
}, [alertOnBottom]);
return (
my html
);
}
您的handleOnDocumentBottom
回调取决于loadRepos
但您尚未在依赖项数组中包含loadRepos
,因此handleOnDocumentBottom
正在被记住并保留其原始值,除非alertOnBottom
更改。由于您要在每个渲染上重新声明loadRepos
,因此handleOnDocument
回调将引用page
1
时在第一个渲染上定义的loadRepos
。您可以handleOnDocumentBottom
将loadRepos
添加到依赖项数组中,但这违背了useCallback
的目的,因为loadRepos
是每个渲染的新引用,无论如何都会在每个渲染上创建handleOnDocumentBottom
。
以下是保留记忆但更正行为的两个选项:
选项 1 - 将page
添加到依赖项数组。每当page
发生变化时,正确的loadRepos
引用都会在handleOnDocumentBottom
中关闭,但遵循逻辑并意识到page
是loadRepos
的隐式依赖关系有点棘手。此外,如果loadRepos
最终依赖于将来的另一个值,则需要更新handleOnDocumentBottom
依赖项数组以避免细微的错误:
const handleOnDocumentBottom = useCallback(() => {
console.log("I am at bottom! ");
loadRepos();
if (alertOnBottom) {
alert('Bottom hit! Too slow? Reduce "debounce" value in props');
}
}, [alertOnBottom, page]); // refresh `handleOnDocumentBottom` whenever page changes
选项 2 是将loadRepos
也设置为回调,然后将其添加到依赖项数组中以handleOnDocumentBottom
:
const loadRepos = useCallback(() => {
const date = new Date();
date.setDate(date.getDate() - 30);
const dateString = date.toISOString().split("T")[0];
getData(page, dateString); // here page is still 1 :(
}, [page]); // add page as a dependency here
useEffect(() => {
loadRepos();
}, []);
const handleOnDocumentBottom = useCallback(() => {
console.log("I am at bottom! ");
loadRepos();
if (alertOnBottom) {
alert('Bottom hit! Too slow? Reduce "debounce" value in props');
}
}, [alertOnBottom, loadRepos]); // add the memoized loadRepos here
现在,如果loadRepos
获得任何新的依赖项或更改,则handleOnDocumentBottom
不需要更改,并且依赖项关系是显式的。