【发布时间】:2020-11-24 11:29:52
【问题描述】:
每当我在上下文中更新users (array) 中的user (object) - 所有使用users 的组件都会重新渲染。
我尝试过的
我有一个使用上下文值的组件:
const DashboardCardList=()=> {
const context = useContext(StaticsContext);
const users = context.users.filter(user=>user.visible);
return !users
? <Loading/>
: (
<Container>
{users.map(user=>
<DashboardCard key={user._id} user={user}/>
)}
</Container>
);
};
我的更新函数(更新上下文状态):
const onUserUpdate=(user)=>{
const index = this.state.users.findIndex(item => item._id === user._id);
const users = [...this.state.users]
users[index] = user;
this.setState({users:users});
}
最终组件:
const DashboardCard=({user})=> {
console.log("I'm here!", user);
return ...;
}
问题
为什么它一直重新渲染?是不是因为context?
这个要怎么写?
【问题讨论】:
-
看来你打错了:
findIndex(item => item._id === item._id); -
是的,这就是上下文的“问题”。它每次更改时都会渲染每个组件。这就是 redux 或 mobx 变得如此流行的原因。但是,如果您保持上下文足够小或创建多个上下文,则不会引起问题。如果这样做,请尝试使用 redux/mobx 看看是否会改变它。
-
@Domino987 我明白了。它是否仅在您使用某些显式上下文值(如 users)或我使用
useContext时呈现?可能是React.memo或类似的东西在这里有用吗? Redux 对于我的项目 atm 来说似乎有点矫枉过正。 -
@Jax-p Reactm.memo 仅适用于 props,不适用于 useContext 挂钩,但有一些方法,阅读更多 here。但是,如果您没有发现任何问题,那么重新渲染就不是问题,尤其是在项目很小的情况下。 Reredners 本身不是问题,只要它不会减慢您的网站速度。也可以在设置最小的地方研究 zustand 或 recoil。
-
是的,它适用于
DashboardCard级别
标签: javascript reactjs