【发布时间】:2020-01-09 15:44:33
【问题描述】:
我正在尝试将“动作调度”传递给子组件并陷入无限渲染循环,这是我所拥有的一个简单示例:
const ParentComponent = () => {
const dispatch = useDispatch();
const error = useSelector(getError);
const fetching = useSelector(getFetching);
const things = useSelector(getThings);
const fetchData = useCallback(arg => { dispatch(fetchThings(arg)); });
return (
{error && <span>{error}</span>}
{fetching &&< <span>Fetching...</span>}
{!fetching && (
<ChildComponent fetchData={fetchData} data={things} />
})
);
};
const ChildComponent = ({fetchData, data, ...otherStuff}) => {
const [arg, setArg] = useState();
useEffect(() => { fetchData(arg); }, [fetchData, arg]);
return (
... MARKUP ...
);
};
export default ChildComponent;
“arg”是孩子中的一个变量,我可以在 UI 中更改,我希望在数据更改时重新调整数据。在初始渲染(和无限渲染)时,我可以看到它永远不会改变。 Per the docs,我觉得还可以;我做错了什么?
【问题讨论】:
-
如果在useEffect中放置了一个空的依赖数组,是否还会出现死循环?不建议将此作为修复,只是一个故障排除步骤。如果这停止了循环,它会告诉您问题出在哪里。
-
它仍然发生。我看到当我分派 fetch 时,它改变了 fetching 变量状态,它重新渲染了父级,这让一切都退缩了。不知道如何处理,这只是将 Container/Presenter redux 连接模式转换为钩子。
-
我认为问题在于
useCallback还需要一个依赖数组,否则它将在每个正在更改fetchData并导致useEffect再次运行的渲染上创建一个新回调。在您从文档链接的示例中,您将看到dispatch被传递给回调依赖数组。所以应该是const fetchData = useCallback(arg => { dispatch(fetchThings(arg)); }, [dispatch]);
标签: reactjs redux react-redux react-hooks