reactjs - 如何在 Reactjs 中使用上下文提供者和消费者?
问题描述
数据提供者.js
import React, { Component } from "react";
import {ProjectFirestore} from '../Config/Firebase';
const DataContext = React.createContext();
class DataProvider extends Component {
state = {
orderHistory: [],
};
componentDidMount() {
this.fetchUserOrderHistory();
}
fetchUserOrderHistory = ()=>{
let orderHistory = [];
let orderRef = ProjectFirestore.collection("global-orders");
let query = orderRef.where('user_id', '==', 'someId')
query.get().then((querySnapshot) => {
querySnapshot.forEach((doc) => {
orderHistory.push({
id : doc.id,
itemprice : doc.data().itemprice,
});
});
this.setState(() => {
return { orderHistory };
});
});
};
render() {
return (
<DataContext.Provider
value={
{...this.state}
}
>
{this.props.children}
</DataContext.Provider>
);
}
}
const DataConsumer = DataContext.Consumer;
export { DataProvider , DataConsumer };
OrderHistory.js
import { DataConsumer } from "../contexts/DataProvider.js";
export default function OrderHistory() {
return (
<>
<Header />
<DataConsumer>
{
value => {
return value.orderHistory.map( (item) =>{
return
(
<div>
{item.deliverycharge}
);
});
}
}
</DataConsumer>
</div>
<Footer/>
</>
);
}
错误:无法读取未定义的属性“orderHistory”
组件DataProvider从 firebase firestore 获取数据并使用return {orderHistory}
. 我希望能够使用orderHistory组件orderHistory: []
中的值。问题是' orderHistory.js'中传递的值始终为空。我不想要替代品,我只需要帮助找出这个特定代码有什么问题。<DataConsumer>
解决方案
我们还需要在 .xml 中导入DataProvider以./App.js
提供其封装在<DataProvider> ... </DataProvider>
.
import { DataProvider } from './contexts/DataProvider.js'
export default function App() {
return (
<Router>
<div className="App">
<AuthProvider>
<DataProvider>
<Switch>
<Route path="/" exact component={Home} />
<Route path='/history' component={OrderHistory}/>
</Switch>
</DataProvider>
</AuthProvider>
</div>
</Router>
);
}
推荐阅读
- javascript - Angular 在 RTL 模式下的 UI-Grid 以与 columnDefs 顺序相反的错误顺序显示数据
- assembly - 汇编 x86 中的 fizzbuzz 不输出任何内容
- angular - 如何在 Angular 中创建自定义 QueryParam 并将它们传递给路由器的 NavigationExtras?
- android - 有没有办法混淆类名而不是 R8 的成员
- reactjs - 如何在 TestCafe 中单击未渲染的虚拟化元素
- azure - 归档 Azure 搜索服务
- sparql - 如何使用 SPARQL 获取所有逆属性?
- python - 如何禁止在 Python 中创建新的类属性?
- javascript - 带有 D3.js 的响应式词云
- python - 用于删除主机名中的域的正则表达式