with-lifecycle
Part of a collection of Higher-Order Components for React, especially useful with Recompose.
Inspired by Reassemble, in comparison with Recompose lifecycle this HOC provides a handy (and limited) way to use some of React Component Lifecycle methods such as:
onConstructor(props)onWillMount(props)onDidMount(props)onReceiveProps(props, nextProps)–getDerivedStateFromPropsas a callback but without returned stateonGetSnapshotBeforeUpdate(prevProps, props)– any returned value will be passed assnapshotparameter toonDidUpdateonDidUpdate(prevProps, props, snapshot)onWillUnmount(props)onDidCatch(error, info)
So no this, you have no direct access to class instance anymore ().
Install
yarn add @hocs/with-lifecycle
Usage
withLifecycle(
methods: Object
): HigherOrderComponent
import React from 'react';
import { compose, withState } from 'recompose';
import withLifecycle from '@hocs/with-lifecycle';
const Demo = ({ isLoading }) => (
<h1>{ isLoading ? 'Loading' : 'Done' }</h1>
);
export default compose(
withState('isLoading', 'setLoading', true),
withLifecycle({
onDidMount({ setLoading }) {
setLoading(true, () => {
setTimeout(() => setLoading(false), 3000);
})
},
onReceiveProps(props, nextProps) {
console.log(`isLoading: ${props.isLoading} → ${nextProps.isLoading}`);
}
})
)(Demo);
In addition, it can handle a factory function which works like Recompose withHandlers factory:
withLifecycle(
methodsFactory: (initialProps: Object) => Object
): HigherOrderComponent
withLifecycle(
({ shouldLoadOnMount }) => {
if (shouldLoadOnMount) {
return {
onDidMount({ setLoading }) {
setLoading(true, () => {
setTimeout(() => setLoading(false), 1000);
})
}
};
}
}
)
As a bonus you can "share" stuff across different lifecycle methods in that factory scope with let mySharedStuff, just like you did before with this.mySharedStuff using a class instance.