@swiggy/react-context-decorator
A React utility function to decorate a component with context, similar to how react-redux works.
You might want to look into upcoming experimental useContext
React Hook which might solve the problem in much more elegant way.
Installation
npm install @swiggy/react-context-decorator
Motivation
While render props pattern is a cool way to get data out
from a Component, it can be quite messy to use. Higher Order Components tend to keep code less messy, but have their own issues. However, we feel that it would've been a nightmare if Redux never shipped with connect
(part of react-redux) and asked the user to rely on Render props everywhere. Similar to connect
, decorateWithContext
makes it easier to mapContextToProps
and escape from render prop hell.
Usage
View on CodeSandbox.
import React from "react";
import ReactDOM from "react-dom";
import { decorateWithContext } from "@swiggy/react-context-decorator";
const MyContext = React.createContext({ name: "", age: 0 });
const withMyContext = decorateWithContext(MyContext);
const Greeting = props => <h1>Hello {props.name}!</h1>;
const withName = withMyContext(context => ({ name: context.name }));
const MyGreeting = withName(Greeting);
const Age = props => <p>Your age is {props.age}.</p>;
const withAge = withMyContext(context => ({ age: context.age }));
const MyAge = withAge(Age);
const Profile = props => (
<React.Fragment>
<MyGreeting />
<MyAge />
</React.Fragment>
);
const Content = props => (
<div>
<Profile />
</div>
);
class App extends React.PureComponent {
state = {
age: 0,
name: ""
};
render() {
return (
<MyContext.Provider value={this.state}>
<input
type="text"
placeholder="Enter your name"
value={this.state.value}
onChange={e => this.setState({ name: e.target.value })}
/>
<input
type="number"
placeholder="Enter your age"
value={this.state.age}
onChange={e => this.setState({ age: e.target.value })}
/>
<Content />
</MyContext.Provider>
);
}
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
Contributions
Feel free to report issues or raise pull requests.