Reactjs 上下文更改后组件未重新呈现
“myGroups”是一个上下文变量。在我的上下文存储中,我从数据库获取数据并填充这个“myGroups”变量。所以最初它只包含一个空数组,一段时间后它包含一个对象数组。e、 g.{id:,数据:}] 我要渲染这些组。因此,我正在映射myGroups变量,并尝试渲染它们 但问题是,即使在上下文更新之后,我的组件也不会重新呈现。我已经在控制台上记录了日志,并且看到数据的获取工作非常好,尽管这样做需要一些时间 更改上下文是否不会重新引发消费者的兴趣?为什么部件没有重新招标?如果你能提供一些解决方案,那将是非常有帮助的。提前谢谢 这是我的密码Reactjs 上下文更改后组件未重新呈现,reactjs,react-hooks,react-state,Reactjs,React Hooks,React State,“myGroups”是一个上下文变量。在我的上下文存储中,我从数据库获取数据并填充这个“myGroups”变量。所以最初它只包含一个空数组,一段时间后它包含一个对象数组。e、 g.{id:,数据:}] 我要渲染这些组。因此,我正在映射myGroups变量,并尝试渲染它们 但问题是,即使在上下文更新之后,我的组件也不会重新呈现。我已经在控制台上记录了日志,并且看到数据的获取工作非常好,尽管这样做需要一些时间 更改上下文是否不会重新引发消费者的兴趣?为什么部件没有重新招标?如果你能提供一些解决方案,
import React, { useContext, useEffect, useState } from 'react';
import "../css/MyGroups.css";
import GroupCard from './GroupCard';
import { GlobalContext } from '../context/GlobalState';
const MyGroups = () => {
const { myGroups } = useContext(GlobalContext);
useEffect(() => console.log(myGroups), [myGroups]); // Debugging
return (
<div className="my__groups">
<h1 className="my__groups__heading">My Groups</h1>
<div className="my__groups__underline"></div>
<div className="my__groups__grid__container">
{
myGroups.map(({id, data}) => (
<GroupCard
key={id}
name={data.name}
image={data.image}
/>
))
}
</div>
</div>
)
}
export default MyGroups
编辑2:Reducer
const Reducer = (state, action) => {
switch(action.type) {
case FETCH_GROUPS_FROM_DATABASE:
return {
...state,
myGroups: action.payload
};
default:
return state;
}
}
export default Reducer;
如上所述,不需要使用useState
和useffect
。您可以用两种不同的方式使用上下文
首先:
const MyGroups = () => (
<GlobalContext.Consumer>
{({ myGroups }) => (
<div className="my__groups">
<h1 className="my__groups__heading">My Groups</h1>
<div className="my__groups__underline"></div>
<div className="my__groups__grid__container">
{myGroups.map(({id, data}) => (
<GroupCard
key={id}
name={data.name}
image={data.image}
/>
))
}
</div>
</div>
)}
</GlobalContext.Consumer>
);
const MyGroups = () => {
const { myGroups } = useContext(GlobalContext);
return (
<div className="my__groups">
<h1 className="my__groups__heading">My Groups</h1>
<div className="my__groups__underline"></div>
<div className="my__groups__grid__container">
{myGroups.map(({ id, data }) => (
<GroupCard key={id} name={data.name} image={data.image} />
))}
</div>
</div>
);
};
您确实不需要在组件的本地状态中保存
myGroups
。每当上下文中的内容更新时,使用该上下文的所有组件都将重新呈现。因此,使用useState
从上下文中保存一些数据是完全不必要的。您可以共享您的GlobalContext
?遵循您的语法…但是我的组件在上下文更改或状态更改时都没有重新呈现…您可以共享您的GlobalContext吗?您是否将组件包装在GlobalContext
中?MyGroups组件是主组件的子组件。在我问题的最后一个部分,我还展示了MyGroups上下文的控制台日志的图像。你也可以看一下并检查一下。
const MyGroups = () => (
<GlobalContext.Consumer>
{({ myGroups }) => (
<div className="my__groups">
<h1 className="my__groups__heading">My Groups</h1>
<div className="my__groups__underline"></div>
<div className="my__groups__grid__container">
{myGroups.map(({id, data}) => (
<GroupCard
key={id}
name={data.name}
image={data.image}
/>
))
}
</div>
</div>
)}
</GlobalContext.Consumer>
);
const MyGroups = () => {
const { myGroups } = useContext(GlobalContext);
return (
<div className="my__groups">
<h1 className="my__groups__heading">My Groups</h1>
<div className="my__groups__underline"></div>
<div className="my__groups__grid__container">
{myGroups.map(({ id, data }) => (
<GroupCard key={id} name={data.name} image={data.image} />
))}
</div>
</div>
);
};
async function fetchGroupsFromDatabase(id) {
const doc = await db.collection("users").doc(id).get() // Fetch user details with given id
const myGroups = await Promise.all(
doc.data().groupIDs.map(groupID => // Fetch all group IDs of the user
db.collection("groups").doc(groupID).get() // Fetch all the groups
.then(doc => ({ id: doc.id, data: doc.data() }))
)
);
const action = {
type: FETCH_GROUPS_FROM_DATABASE,
payload: myGroups
};
dispatch(action);
}