【发布时间】:2021-04-24 20:02:47
【问题描述】:
我正在使用 React 和 React 路由器。我在 App.js 中定义了所有数据获取和路由。
我正在单击嵌套子组件<ChildOfChild /> 中的按钮,该按钮在单击按钮(使用上下文 API 向下传递函数)时刷新我的数据,并且在我的顶级组件 App.js 中发生了获取请求(我有一个控制台。在那里登录,所以它肯定会在点击时获取)。但是数据的刷新状态永远不会到达<ChildOfChild /> 组件。相反,它会刷新旧状态。我究竟做错了什么。以及如何确保<Link> 中的状态在状态更新时刷新。
我希望在单击按钮时更新 item.name 值。
应用组件
- 已获取所有路由和数据
- 使用 Reacts Context API,我用它来将我的获取传递给子组件
- 低于 App 组件的基本形状。
import React, {useEffect, useState} from "react";
export const FetchContext = React.createContext();
export const DataContext = React.createContext();
const App = () => {
const [data, setData] = useState([false, "idle", [], null]);
useEffect(() => {
fetchData()
}, []);
const fetchData = async () => {
setData([true, "fetching", [], null]);
try {
const res = await axios.get(
`${process.env.REACT_APP_API}/api/sample/`,
{
headers: { Authorization: `AUTHTOKEN` },
}
);
console.log("APP.js - FETCH DATA", res.data)
setData([false, "fetched", res.data, null]);
} catch (err) {
setData([false, "fetched", [], err]);
}
};
return (
<Router>
<DataContext.Provider value={data}>
<FetchContext.Provider value={fetchData}>
<Switch>
<Route exact path="/sample-page/" component={Child} />
<Route exact path="/sample-page/:id" component={ChildOfChild} />
</Switch>
</FetchContext.Provider>
</DataContext.Provider>
</Router>
)
}
子组件
import { DataContext } from "../App";
const Child = () => {
const [isDataLoading, dataStatus, data, dataFetchError] = useContext(DataContext);
const [projectsData, setProjectsData] = useState([]);
{
data.map((item) => (
<Link
to={{
pathname: `/sampe-page/${item.id}`,
state: { item: item },
}}
>
{item.name}
</Link>
));
}
子组件的子组件
import { FetchContext } from "../App";
const ChildOfChild = (props) => {
const getData = useContext(FetchContext);
const [item, setItem] = useState({});
const [isItemLoaded, setIsItemLoaded] = useState(false);
useEffect(() => {
if (props.location.state.item) {
setItem(props.location.state.item);
setIsItemLoaded(true);
}
}, [props]);
return (
<div>
<button onClick={() => getData()}Refresh Data</button>
<div>{item.name}</div>
</div>
)
}
【问题讨论】:
-
能贴出上下文代码吗?
-
如果我理解您的描述,您单击按钮调用
getData并且某些状态将在上下文中更新并重新呈现组件?请在您的问题中包含相关的上下文代码、提供程序等。当上下文更新时,您希望ChildOfChild做什么? -
@ViniciusKatata 我为
Appcomponent 添加了更多代码。尤其是useContext的信息。 -
你用
data做什么,好像没用过。 -
@DrewReese 谢谢,请给我一点时间,我将添加所有逻辑。
标签: reactjs react-context