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)
–getDerivedStateFromProps
as a callback but without returned stateonGetSnapshotBeforeUpdate(prevProps, props)
– any returned value will be passed assnapshot
parameter toonDidUpdate
onDidUpdate(prevProps, props, snapshot)
onWillUnmount(props)
onDidCatch(error, info)
So no this
, you have no direct access to class instance anymore (:tada:).
yarn add @hocs/with-lifecycle
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.