react-augment v1.0.5
react-augment 
Augment your React component with multiple Higher Order Components
Installation
npm install react-augment --saveWhy
When you're working with Higher Order Components, most general approach to augment a Component is to invoke a HOC and pass the Component as an argument.
import { someHOC } from 'someHOC';
class Example extends Component () {}
export default someHOC(Component);In case of two or more HOCs, you can set them up in the following way:
import { someHOC } from 'someHOC';
import { someOtherHOC } from 'someOtherHOC';
class Example extends Component () {}
export default someHOC(someOtherHOC(Component));What react-augment enables you to do is to augment your Component by composing multiple HOCs in a more robust, lexical way.
import { augmentComponent } from 'react-augment';
import { someHOC } from 'someHOC';
import { someOtherHOC } from 'someOtherHOC';
@augmentComponent([
someHOC,
someOtherHOC
])
export default class Example extends Component {}Usage
@augmentComponent
@augmentComponent(HOC, HOC, {})
| Params | Type | Description |
|---|---|---|
| HOCS | Array | Array of HOCs to be used for augmenting Component. |
| params | Object | Optional object to be passed as a second argument to the invoking HOC. |
Augment
| Methods | Description |
|---|---|
| register | Register your HOCS to be used globally as annotations. |
| component | No-decorator approach method. |
| list | Returns all registered HOC annotations. |
Augment.register({ 'HOC': HOC })
| Params | Type | Description |
|---|---|---|
| HOCS | Object | Config object containing HOCs to be annotated. Notice: Config key will be used as annotation. |
Augment.component(HOC, HOC, {})
Same as @augmentComponent above
Augment.list()
Example
You'd like to augment your Example component with a HOC that handles navigation and some other HOC.
|-- components/
|-- Example.js
|-- containers/
|-- hoc/
|-- index.js
|-- useNavigation.js
|-- someOtherHOC.js// components/Example.js
export default class Example extends Component {}// containers/hoc/useNavigation.js
import React, { Component } from 'react';
import { browserHistory } from 'react-router';
/**
* @description
* Higher order component
* Component wrapper augmenter used for navigation
*
* @param {Function} WrappedComponent
* @param {Object} optionalConfig
* @return {Object}
* @public
*/
export const useNavigation = (WrappedComponent, optionalConfig) =>
class UseNavigation extends Component {
constructor (props) {
super(props);
this.onNavigate = this.onNavigate.bind(this);
}
/**
* @description
* On navigate to route.
*
* @param {String} route
* @return {Function}
* @public
*/
onNavigate (route) {
return browserHistory.push(route);
}
render () {
return (
<WrappedComponent { ...this.props } navigate={ this.onNavigate } />
);
}
};// containers/hoc/index.js
import { useNavigation } from './useNavigation';
import { someOtherHOC } from './someOtherHOC';
export default {
useNavigation,
someOtherHOC
};Import & export
There are two ways you can implement react-augment:
- use
@augmentComponentdecorator - use
Augmentobject.
Note: To use a decorator you'll need to install transform-decorators-legacy babel plugin.
Note: Order of the HOC is irrelevant
import { augmentComponent } from 'react-augment';
import HOC from 'containers/hoc';
@augmentComponent([
HOC.useNavigation,
HOC.someOtherHOC
], { optional: 'config that will be passed to a HOC as a second argument' })
export default class Example extends Component {}import { Augment } from 'react-augment';
import HOC from 'containers/hoc';
class Example extends Component {}
export default Augment.component(Example, [
HOC.useNavigation,
HOC.someOtherHOC
], { optional: 'config will be passed as a second argument to a HOC component' });Annotation approach
You can register all your HOCs' namespaces at one of the main component wrappers (such as App)
import { Augment } from 'react-augment';
import HOC from 'containers/hoc';
Augment.register(HOC);This way you can supply the array of your HOC namespaces so you don't have to import them in each of the components.
instead of
[
HOC.useNavigation,
HOC.someOtherHOC
]use
[
'useNavigation',
'someOtherHOC'
]Development
Prerequisites
Node.js >= v4 must be installed.
Running
npm installin the components's root directory will install everything you need for development.npm startwill run a development server with the component's demo app at http://localhost:3000 with hot module reloading.
Running Tests
npm testwill run the tests once.npm run test:coveragewill run the tests and produce a coverage report incoverage/.npm run test:watchwill run the tests on every change.
Building
npm run buildwill build the component for publishing to npm and also bundle the demo app.npm run cleanwill delete built resources.
License
MIT © David Lazic