Since mixins are dead, higher order components are the way to go.
But when you use multiple higher order component for a Component it can be confusing, you have to think about where the behavior comes from.
An Extension is namespaced and also explicit about what are the methods/variables that are be provided to the Component.
To create an Extension:
Here we are defining a UserConnection
extension, it allows to get the user information it allows you to call in your component, this.props['UserConnection'].variables.firstName
and this.props['UserConnection'].variables.lastName
.
If you want to refresh the user simply call this.props['UserConnection'].refresh()
.
You can pass accountUrl
and updateAccountUrl
as params of the Extension.
; const UserConnection = // This is the public name of the Extension extensionName: 'UserConnection' exports: // Variables accessibles from the Extension variables: 'firstName' 'lastName' // Methods callable on the Extension methods: 'refresh' // Required params to use the extension // should be an object key: 'description' requiredParams: accountUrl: 'url to fetch the user' optionalParams: updateAccountUrl: 'url to update the user' ;
To use the Extension:
Component { <div> hello thisprops'UserConnection'variablesfirstName click <button onClick=thisprops'UserConnection'refresh>here</button> to refresh </div> } AccountPage accountUrl: 'api/account';
Other Examples
const AddSpinningLoader = extensionName: 'AddSpinningLoader' exports: methods: 'start' 'stop' { return loading: false } { this } { this } { let spinningLoader = thisstateloading ? <SpinningLoader/> : null; return <div> spinningLoarder this </div> } ; ;
@AddSpinningLoaderComponent { superprops; thisonSubmitButton = thisonSubmitButton; thisstate = firstName: '' ; } { thisprops'ValidationErrorBar'; } { thisprops'AddSpinningLoader'start; $; } { <div> <input type="text" value=thisstatefirstName onChange= this />; <button onClick=thisonSubmitButton /> </div> } Form = ; ;
Install
npm install --save react-component-extension
Updating from a React Mixin to an Extension
It is pretty straightforward to make a React Mixin an Extension, for example here is react-timer-mixin as an Extension
TODO
- Add tests
- Really do the example code
- Add examples