I have been trying to add state-management to my react app using React ContextAPI, but I am running into an issue. I am using class components, the idea is here to get data from a component using Axios and pass data to a dashboard to summarize the data.
Component A -- > Provider component
Component B --> Consumer component
Component C -- > Dashboard -- > Consuming ComponentB
When I browse the dashboard, the state value always comes undefined. Any suggestions on how I can resolve this? Appreciate your help.
package.json "react": "^16.12.0", "react-dom": "^16.12.0", "react-router-dom": "^5.1.2", "react-scripts": "3.3.0",
App.js
import React, { Component } from "react";
import "./App.css";
import { Route, Switch } from "react-router-dom";
import Dashboard from "./components/dashboard";
import ComponentA from "./components/a"
import "rsuite/dist/styles/rsuite-default.min.css";
import SomeContext from "./context/context.js";
class App extends Component {
state = {};
render() {
return (
<React.Fragment>
<Sidebar />
<Switch>
<Route path="/dashboard" component={Dashboard} />
<Route path="/a" component={ComponentA} />
</Switch>
</React.Fragment>
);
}
}
export default App;
SomeContext.js
import React from "react";
const SomeContext = React.createContext();
SomeContext.displayName = "SomeContext";
export default SomeContext;
Component A --> Provider Component
import React, { Component } from "react";
import axios from "axios";
import { Card, CardHeader, Table, Container, Row } from "reactstrap";
import SomeContext from "./context/context.js";
class ComponentA extends Component {
state = {
posts: [],
};
async componentDidMount() {
const { data: posts } = await axios.get("http://localhost:5000/api");
this.setState({ posts });
console.log(posts);
}
render() {
return (
<div className="main-content" ref="main-content">
<Container fluid>
<SomeContext.Provider value={{ state:this.state }}>
<ComponentB/>
**.....Some component code **
</SomeContext.Provider>
</Container>
</div>
);
}
}
export default ComponentA;
Component B -- Consuming data from ComponentA
import React, { Component } from "react";
import SomeContext from "./context/context.js";
class ComponentB extends Component {
static contextType = SomeContext;
render() {
return (
<SomeContext.Consumer>
{(dashboard) => (
<div>Data: {dashboard} {console.log(dashboard)} </div>
)}
</SomeContext.Consumer>
);
}
}
export default ComponentB;
Dashboard
import React, { Component } from "react";
import ComponentB from "./components/b";
class Dashboard extends Component {
render() {
return (
<div className="main-content">
<ComponentB />
</div>
);
}
}
export default Dashboard;
Consumerunder (inside) yourProviderin order to get it work.ComponentB, which is theConsumer, is not under theProvider, which isComponentA.ComponentBwhich is underDashBoardis meaningless, isn't it? You still get what undefined?