想象一下,我有一些自定义钩子,我从上下文(某种我自己的存储)中提取一些值
// example of state structure
function GlobalComponent(){
const initialState = {
reports: {depositReport: []},
users: [],
}
const [state, dispatch] = useReducer(reducer, initialState)
return <StoreContext.Provider value={{state}}></State.Provider>
}
个字符
这是我如何使用这个钩子的例子
function Component() {
const { depositReport } = useSelector(state => state.reports);
}
型
当我通过Component
中的示例从状态中提取depositReport
值时,每当state
对象中的任何属性发生变化时,它都会重新呈现。但是我如何才能优化useSelector
钩子,重新渲染组件时,它只使用特定值state => state.reports
才会改变。
检查codesandbox上的示例,你会看到当我改变users
属性时,它会重新渲染我只提取reports.depositReport
但我想要优化useSelector
钩子的地方,它只会在我提取值时重新渲染我想要对的改变做出React
的数据
2条答案
按热度按时间wztqucjr1#
这是不可能的。它使用在每次渲染时更改值的上下文。如果该值更改,则使用
useContext(StoreContext)
的每个子组件都会重新渲染。没有办法防止这种情况发生。您可以使用第三方库,如
use-context-selector
或创建自己的商店。它并不像仅仅调用useContext那么简单a11xaf1n2#
因此,基于提供的沙箱,我能够找到两个关键的地方,你可以减少不必要的重新渲染:
useSelector
函数Users
组件以下是已实施的更改:
字符串
在这里,如果回调函数或状态对象发生更改,则使用
useMemo
将重新计算状态的选定部分。然而,这要求您在从组件调用callback
函数时将其 Package 在useCallback
钩子中,因此更新了Users
组件:型
areArraysEqual
的定义:型