with-context

Decorator for new React Context API

Downloads in past

Stats

StarsIssuesVersionUpdatedCreatedSize
with-context
5330.0.35 years ago5 years agoMinified + gzip package size for with-context in KB

Readme

with-context
Best practice of new React Context API

Why with-context?

  1. Less boilerplate/verbosity
  2. Make the usage more easier
  3. Tiny, only 1.8k before compressed

Suggest considering with-context as your best practice.

Live Demo

Check here for online live demo: https://jqkyy1oyv.codesandbox.io/

How to install

npm i --save with-context

Simple Usage

You could use with-context as a decorator -- @withContext(SomeContext) -- on your leaf components.
Here is a example, you may have a file withTheme.js
import { withContext } from "with-context";

export const ThemeContext = React.createContext("light");
export const withTheme = withContext(ThemeContext, "theme");

Wrap your top component by ThemeContext just as the official demo.
And then, you could use withTheme for any leaf component which need theme.
You could use it as a decorator on your leaf component LeafComponent.js. And then you could simply use this.props.theme in that component.
import { withTheme } from "./withTheme";
import { styles } from "../consts";

@withTheme
export default class LeafComponent extends React.PureComponent {
  render() {
    const { theme } = this.props;
    return (
      <div style={styles[theme]}>LeafComponent with theme: {theme}</div>
    );
  }
}

Apply multiple context

You also could apply multiple context by this API -- @withMultiContext({theme: ThemeContext, lang: LangContext}).
Here is a example, you could have a file withThemeAndI18n.js
import { withMultiContext } from "with-context";

export const ThemeContext = React.createContext("light");
export const LangContext = React.createContext("en");
export const withThemeAndI18n = withMultiContext({
  theme: ThemeContext,
  lang: LangContext
});

And then for a leaf component LeafComponent.js, you could use const { theme, lang } = this.props.
import { withThemeAndI18n } from "./withThemeAndI18n";
import { styles, langs } from "../consts";

@withThemeAndI18n
export default class LeafComponent extends React.PureComponent {
  render() {
    const { theme, lang } = this.props;
    const langSet = langs[lang];
    return (
      <div style={styles[theme]}>
        <p>with theme: {langSet && langSet[theme]}</p>
        <p>with lang: {lang}</p>
      </div>
    );
  }
}

Work with stateless functional component

with-context also works with stateless functional component. For example.
import { withTheme } from "./withTheme";
import { styles } from "../consts";

const StatelessFunctionalComponent = ({ theme }) => {
  return (
    <div style={styles[theme]}>
      StatelessFunctionalComponent with theme: {theme}
    </div>
  );
};

export default withTheme(StatelessFunctionalComponent);