【发布时间】:2021-05-24 17:11:49
【问题描述】:
我正在尝试创建一些挂钩来获取 Redux 存储的切片,以便存储无法直接访问以返回任何内容。
如果我直接在组件中使用Selector,它会很好地工作并且不会不必要地重新渲染:
*** Modal.tsx ***
const { isModalOpen } = useSelector((state: RootState) => state.carsSlice); // Works great. No unnecessary re-renders
如果我创建一个挂钩来返回 carsSlice,那么它会不必要地重新渲染整个页面。为什么?
例如,
*** StateHooks.ts ***
const useGlobalState = () => useSelector((state: RootState) => state);
export const useCarsState = () => useGlobalState().carsSlice;
*** Modal.tsx ***
const { isModalOpen } = useCarsState(); // Re-renders underlying page and is significantly slower than above approach
我正在从状态中获取特定值,所以我不明白为什么它会重新呈现它正在使用的整个页面?有没有办法做到这一点?
我也尝试了以下方法,但它仍然会导致页面重新渲染:
const useCarsState = useSelector((state: RootState) => state.carsSlice); // Same result
它按预期工作的唯一方法是下面但我想要上面的自定义钩子:
const { isModalOpen } = useSelector((state: RootState) => state.carsSlice); // Works great
谢谢大家。
【问题讨论】:
-
你能分享一个演示codesandbox.io吗? StateHooks 示例不会按预期工作,因为您仍在调用返回整个状态的函数。但最后 2 个示例应该可以工作,所以通过一个工作示例也许我可以提供帮助
标签: reactjs typescript redux redux-toolkit