1- Create a Context constant and export it
We will import this constant(const) in all functions which we will be using the context. I will name the file Context.js
//Context.js
import React from "react";
export const Context = React.createContext();
2- In App.js Import and provide the context to all Functional Components
//App.js
import React, { useState } from "react";
import { Context } from "./Context.js";
import ComponentA from "./ComponentA";
import ComponentB from "./ComponentB";
export default function App() {
const [context, setContext] = useState("default context value");
return (
<Context.Provider value={[context, setContext]}>
<ComponentA />
<ComponentB />
</Context.Provider>
);
}
To do that we do 3 things :)
a- Import the Context we created in 1st step
b- Create a state (via useState) which we will share between components.
c- Wrap components with Context.Provider and pass the state(context) and a function(setContext) to update the state which we created in step b.
3- Consume and set/change value of the context in child components.
//ComponentA.js
import React, { useContext } from "react";
import { Context } from "./Context";
export default function ComponentA() {
const [context, setContext] = useContext(Context);
return (
<div>
ComponentA:
<button onClick={() => setContext("New Value")}>
Change Context Value
</button>
</div>
);
}
//ComponentB.js
import React, { useContext } from "react";
import { Context } from "./Context";
export default function ComponentB() {
const [context, setContext] = useContext(Context);
return <div>ComponentB: {context}</div>;
}
To consume and change the value of context:
a- Import Context we created in step 1.
b- Import useContext from "react"
c- Consume value of context via useContext and use it like a state variable (see ComponentB)
d- Change the value via setContext function which we get from useContext (see ComponentA)
Full Code:
Top comments (10)
That's exactly I was looking for and thanks for explaining it such clearly. I followed the same steps in my react native app. But the problem I see here is when my child screen changes the state, it navigates to parent screen.
As a noob I am sure I am doing something wrong.. but not able to figure out. Could you suggest me where should I look into to figure this out?
My flow is
The Navigator has multiple stacks and one of them changes the value of context.
It saves my life. Greate article.
Any idea on how to do this using typescript?
did you find any solution?
something like this maybe ?
createContext<[string, React.Dispatch<React.SetStateAction<string>>]>([null!, () => null!]);
I tried useState for Map:
const [settingValues, setSettingValues] = React.useState>(() => new Map())
When I try to put [settingValues, setSettingValues] to context provider, I have this error: Type '(Map | Dispatch>>)[]' is missing the following properties from type 'Map': clear, delete, get, has, and 3 more.
Thank's a lot, saved me a ton of time!!!
thanks a ton !!!
Hey @efearas ! Many thanks! God bless you man in Jesus Christ the Lord Name!
It works just as I expected.
Awesome job!
Thanks! In component B
const context = useContext(Context);
would work as well if we don't intend to set it there, right?