170 lines
3.6 KiB
Markdown
170 lines
3.6 KiB
Markdown
# react-universal-interface
|
|
|
|
Easily create a component which is render-prop, Function-as-a-child and component-prop.
|
|
|
|
```js
|
|
import {render} from 'react-universal-interface';
|
|
|
|
class MyData extends React.Component {
|
|
render () {
|
|
return render(this.props, this.state);
|
|
}
|
|
}
|
|
```
|
|
|
|
Now you can use it:
|
|
|
|
```jsx
|
|
<MyData render={(state) =>
|
|
<MyChild {...state} />
|
|
} />
|
|
|
|
<MyData>{(state) =>
|
|
<MyChild {...state} />
|
|
}</MyData>
|
|
|
|
<MyData comp={MyChild} />
|
|
<MyData component={MyChild} />
|
|
```
|
|
|
|
---
|
|
|
|
[![][npm-badge]][npm-url] [![][travis-badge]][travis-url] [](https://github.com/streamich/react-universal-interface)
|
|
|
|
Use this badge if you support universal interface:
|
|
|
|
<div align="center">
|
|
<a href="https://github.com/streamich/react-universal-interface">
|
|
<img src="https://img.shields.io/badge/React-Universal%20Interface-green.svg" />
|
|
</a>
|
|
</div>
|
|
|
|
```
|
|
[](https://github.com/streamich/react-universal-interface)
|
|
```
|
|
|
|
|
|
---
|
|
|
|
|
|
Given a `<MyData>` component, it is said to follow **universal component interface** if, and only if, it supports
|
|
all the below usage patterns:
|
|
|
|
```jsx
|
|
// Function as a Child Component (FaCC)
|
|
<MyData>{
|
|
(data) => <Child {...data} />
|
|
}</MyData>
|
|
|
|
// Render prop
|
|
<MyData render={
|
|
(data) => <Child {...data} />
|
|
} />
|
|
|
|
// Component prop
|
|
<MyData component={Child} />
|
|
<MyData comp={Child} />
|
|
|
|
// Prop injection
|
|
<MyData>
|
|
<Child />
|
|
</MyData>
|
|
|
|
// Higher Order Component (HOC)
|
|
const ChildWithData = withData(Child);
|
|
|
|
// Decorator
|
|
@withData
|
|
class ChildWithData extends {
|
|
render () {
|
|
return <Child {...this.props.data} />;
|
|
}
|
|
}
|
|
```
|
|
|
|
This library allows you to create universal interface components using these two functions:
|
|
|
|
- `render(props, data)`
|
|
- `createEnhancer(Comp, propName)`
|
|
|
|
First, in your render method use `render()`:
|
|
|
|
```js
|
|
class MyData extends Component {
|
|
render () {
|
|
return render(this.props, data);
|
|
}
|
|
}
|
|
```
|
|
|
|
Second, create enhancer out of your component:
|
|
|
|
```js
|
|
const withData = createEnhancer(MyData, 'data');
|
|
```
|
|
|
|
Done!
|
|
|
|
|
|
## Installation
|
|
|
|
<pre>
|
|
npm i <a href="https://www.npmjs.com/package/react-universal-interface">react-universal-interface</a> --save
|
|
</pre>
|
|
|
|
|
|
## Usage
|
|
|
|
```js
|
|
import {render, createEnhancer} from 'react-universal-interface';
|
|
```
|
|
|
|
|
|
## Reference
|
|
|
|
### `render(props, data)`
|
|
|
|
- `props` — props of your component.
|
|
- `data` — data you want to provide to your users, usually this will be `this.state`.
|
|
|
|
|
|
### `createEnhancer(Facc, propName)`
|
|
|
|
- `Facc` — FaCC component to use when creating enhancer.
|
|
- `propName` — prop name to use when injecting FaCC data into a component.
|
|
|
|
Returns a component enhancer `enhancer(Comp, propName, faccProps)` that receives three arguments.
|
|
|
|
- `Comp` — required, component to be enhanced.
|
|
- `propName` — optional, string, name of the injected prop.
|
|
- `faccProps` — optional, props to provide to the FaCC component.
|
|
|
|
|
|
## TypeScript
|
|
|
|
TypeScript users can add typings to their render-prop components.
|
|
|
|
```ts
|
|
import {UniversalProps} from 'react-universal-interface';
|
|
|
|
interface Props extends UniversalProps<State> {
|
|
}
|
|
|
|
interface State {
|
|
}
|
|
|
|
class MyData extends React.Component<Props, State> {
|
|
}
|
|
```
|
|
|
|
|
|
## License
|
|
|
|
[Unlicense](./LICENSE) — public domain.
|
|
|
|
|
|
[npm-url]: https://www.npmjs.com/package/react-universal-interface
|
|
[npm-badge]: https://img.shields.io/npm/v/react-universal-interface.svg
|
|
[travis-url]: https://travis-ci.org/streamich/react-universal-interface
|
|
[travis-badge]: https://travis-ci.org/streamich/react-universal-interface.svg?branch=master
|