作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 React 比较陌生。我有一组数据需要在启动时从服务器检索一次且仅一次。然后数据显示在我的 Footer
组件中,该组件位于 App.js
中。我认为 useContext()
可能是最好的方法,但我不太明白。
初始化数据(一个对象)的代码是这样的:
axios.get('/url/to/get/data')
.then((response) => {
const myData = response.data.mydata;
setMyData({ key1: myData.field1, key2: myData.field2, key3: myData.field3 });
});
现在,setMyData 是一个状态,它设置对象的值(它由 Axios 调用返回的各种字段构成。
如何用这个值初始化上下文。
然后我有一个 Footer 组件,所以我想我想做这样的事情
<context.Provider>
<Footer>
</context.Provider>
如果 useContext
不是可行的方法,我愿意接受这个想法。本质上,寻找一个初始化一次的单例,然后页脚组件可以为每个页面检索和呈现它。
最佳答案
您应该定义您的上下文,并在一次性 useEffect
中初始化它。加载后,所有子级都可以使用 useContext
这里的“技巧”是使用一个没有依赖的useEffect
,让它只运行一次(只要它的父级没有重新渲染)
在这个例子中,我在直接子节点(Main)上使用上下文,但它可以在更深层次上使用。
// initialize the context
const MyContext = React.createContext();
function App() {
const [myData, setMyData] = React.useState(null);
// Load your data once
React.useEffect(() => {
axios.get('/url/to/get/data')
.then((response) => {
const myData = response.data.mydata;
setMyData({ key1: myData.field1, key2: myData.field2, key3: myData.field3 });
});
}, []);
// Render the Provider and the app tree
return (
<MyContext.Provider value={myData}>
<Main />
</MyContext.Provider>
);
}
// Consumer
function Main() {
const myData = useContext(MyContext);
if (!myData) {
return <div>Loading...</div>;
}
return (
<div>{myData}</div>
);
}
关于reactjs - 如何在 React 启动时仅初始化一次上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69957468/
我是一名优秀的程序员,十分优秀!