Context Api + Hook, Dark Mode building as a useCase
March 05, 2021
Why this hook ?
The react application (Complex), data is passed in top-down approach (Parent-to-children components) and this made the manual passing of props more complicated. The props for (Example: UI Theme, Local Preferences) become “cumbersome”. So Facebook engineers made some efforts to save us. (Developed another Hook).
What is useContext()
hooks ?
Context provides a way to pass data through the component tree without having to pass props down manually at every level.
import React, { useContext } from 'react';
When to use ?
Context is designed to share data that can be considered “global” for a tree of React components, such as the current authenticated user, theme, or preferred language.
One of the use Case: (Making UI Theme) 🌗
we will be learning Context
in different steps below:
- Setting up
Children.js
(passing props to child component). - Setting up
App.js
(creating Context). - Setting up
Colorify.js
(tweaking UI themes from child).
Setting up Children.js
.
- Make a
Colorify.js
file, which will later contain buttons and some logic to toggle from dark Mode and Light Mode. - Now make a new component file named
Children.js
, which will act as a parent for his Child ComponentColorify.js
see the below diagram to understand the flow of data.
- The main gotcha is that… The props will be passed to
children.js
component and will be accessed down the REACT DOM component i.e to its child components.
Note: more the children, all of them can have access to the props passed to
children.js
.
import React from "react";
import Colorify from "./Colorify";
export default function Children() {
return (
<div>
<Colorify /> // passing children Component
</div>
);
}
Setting up App.js
(Creating Context).
- Import children component
Children.js
. - Making
themes
Object.
const themes = {
light: {
foreground: "#000",
background: "#fff"
},
dark: {
foreground: "#fff",
background: "#000"
}
};
- Now it’s time to creating context: (Moment of truth).
export const ThemeContext = React.createContext(themes);
This line of code means, we are exporting the initialized Context created as ThemeContext
and passing the themes
props(value) as an argument.
- Inside functional Component, passer a wrapper component
<ThemeContext.Provider>
which has avalue prop
pass the theme object as the value prop. - And inside the wrapper component pass the
children
Component where the props need to pass. - This complete piece of code means that … You are passing object
themes
as the default value to prop, that is passed to child component in React DOM Hierarchy.
export default function App() {
return (
<ThemeContext.Provider value={themes}> // wrapper Component
<Children /> // children Component (Props will be passed and accessed to it.)
</ThemeContext.Provider>
);
}
- The Complete Code for App.js is below:
// Complete app.js code
import "./styles.css";
import React from "react";
import Children from "./Children";
const themes = {
light: {
foreground: "#000",
background: "#fff"
},
dark: {
foreground: "#fff",
background: "#000"
}
};
export const ThemeContext = React.createContext(themes);
export default function App() {
return (
<ThemeContext.Provider value={themes}> // wrapper Component
<Children /> // children Component (Props will be passed and accessed to it.)
</ThemeContext.Provider>
);
}
Setting up Colorify.js
Component (Final Logic)
- The final logic for changing UI Theme from
dark
tolight
andforth
. - Start by importing useContext and useState.
import React, { useContext, useState } from 'react';
-
Importing the
Context
that was created inapp.js
import { ThemeContext } from "./App";
- Writing Logic for Dark Mode:
export default function Colorify() {
const theme = useContext(ThemeContext);
const [state, setState] = useState(theme.light);
const darkMode = () => {
setState(theme.dark);
};
const lightMode = () => {
setState(theme.light);
};
return (
<>
<div
style={{
backgroundColor: state.background,
color: state.foreground,
height: 100,
width: 200,
margin: 100,
border: `1px solid ${state.foreground}`
}}
></div>
<button onClick={darkMode}>Dark Mode!</button>
<button onClick={lightMode}>Light Mode!</button>
</>
);
}
-
Dark Mode Functions:
const darkMode = () => { setState(theme.dark); };
-
Light Mode Functions:
const lightMode = () => { setState(theme.light); };
we are just changing state from theme.dark
to theme.light
and setting the background color of the Component as state.foreground
for text color and state.background
for background color.
- The Complete Code for
Colorify.js
is:
// Complete Code for Colorify.js
import React, { useContext, useState } from "react";
import { ThemeContext } from "./App";
export default function Colorify() {
const theme = useContext(ThemeContext);
const [state, setState] = useState(theme.light);
const darkMode = () => {
setState(theme.dark);
};
const lightMode = () => {
setState(theme.light);
};
return (
<>
<div
style={{
backgroundColor: state.background,
color: state.foreground,
height: 100,
width: 200,
margin: 100,
border: `1px solid ${state.foreground}`
}}
></div>
<button onClick={darkMode}>Dark Mode!</button>
<button onClick={lightMode}>Light Mode!</button>
</>
);
}
Check out the preview on codesandbox and play along
Hope you enjoyed the use case for the useContext
Hooks.
Happy Coding!