Security News
ESLint is Now Language-Agnostic: Linting JSON, Markdown, and Beyond
ESLint has added JSON and Markdown linting support with new officially-supported plugins, expanding its versatility beyond JavaScript.
create-react-context
Advanced tools
The create-react-context package is a polyfill for the React context API for React versions below 16.3. It allows you to create a context object which can be used to pass data through the component tree without having to pass props down manually at every level.
Creating Context
This feature allows you to create a new context object. You can set a default value that can be used when a component does not have a matching Provider above it in the tree.
{"const MyContext = createReactContext(defaultValue);"}
Provider Component
The Provider component is used to set the value of the context to be accessible by all components that are its descendants.
{"<MyContext.Provider value={/* some value */}>{/* some child components */}</MyContext.Provider>"}
Consumer Component
The Consumer component is used to read the current context value, provided by the nearest matching Provider above it in the tree.
{"<MyContext.Consumer>{value => /* render something based on the context value */}</MyContext.Consumer>"}
React Redux uses a similar pattern with a Provider and connect function to pass down state from a Redux store. It's more complex and tailored for state management with Redux.
MobX-react provides components like Provider and inject to connect React components to MobX stores. It's similar but is specifically designed to work with MobX state management.
React Broadcast is another library that provides a similar API for creating a broadcast channel that allows you to pass data through the component tree. It's less commonly used since the introduction of the official context API in React.
Polyfill for the proposed React context API
yarn add create-react-context
You'll need to also have react
and prop-types
installed.
const Context = createReactContext(defaultValue);
// <Context.Provider value={providedValue}>{children}</Context.Provider>
// ...
// <Context.Consumer>{value => children}</Context.Consumer>
// @flow
import React, { type Node } from 'react';
import createReactContext, { type Context } from 'create-react-context';
type Theme = 'light' | 'dark';
// Pass a default theme to ensure type correctness
const ThemeContext: Context<Theme> = createReactContext('light');
class ThemeToggler extends React.Component<
{ children: Node },
{ theme: Theme }
> {
state = { theme: 'light' };
render() {
return (
// Pass the current context value to the Provider's `value` prop.
// Changes are detected using strict comparison (Object.is)
<ThemeContext.Provider value={this.state.theme}>
<button
onClick={() => {
this.setState(state => ({
theme: state.theme === 'light' ? 'dark' : 'light'
}));
}}
>
Toggle theme
</button>
{this.props.children}
</ThemeContext.Provider>
);
}
}
class Title extends React.Component<{ children: Node }> {
render() {
return (
// The Consumer uses a render prop API. Avoids conflicts in the
// props namespace.
<ThemeContext.Consumer>
{theme => (
<h1 style={{ color: theme === 'light' ? '#000' : '#fff' }}>
{this.props.children}
</h1>
)}
</ThemeContext.Consumer>
);
}
}
This package only "ponyfills" the React.createContext
API, not other
unrelated React 16+ APIs. If you are using a version of React <16, keep
in mind that you can only use features available in that version.
For example, you cannot pass children types aren't valid pre React 16:
<Context.Provider>
<div/>
<div/>
</Context.Provider>
It will throw A valid React element (or null) must be returned. You may have returned undefined, an array or some other invalid object.
because <Context.Provider>
can only receive a single child element. To fix the error just wrap everyting in a single <div>
:
<Context.Provider>
<div>
<div/>
<div/>
</div>
</Context.Provider>
FAQs
Polyfill for the proposed React context API
The npm package create-react-context receives a total of 1,004,105 weekly downloads. As such, create-react-context popularity was classified as popular.
We found that create-react-context demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
ESLint has added JSON and Markdown linting support with new officially-supported plugins, expanding its versatility beyond JavaScript.
Security News
Members Hub is conducting large-scale campaigns to artificially boost Discord server metrics, undermining community trust and platform integrity.
Security News
NIST has failed to meet its self-imposed deadline of clearing the NVD's backlog by the end of the fiscal year. Meanwhile, CVE's awaiting analysis have increased by 33% since June.