Как создать новую статическую функцию React getDerivedStateFromProps в качестве метода жизненного цикла, используя HoC в библиотеке перекомпоновки?
Недавно выяснилось, что скоро React станет устаревшей componentWillReceiveProps
и на его месте новая статическая функция getDerivedStateFromProps
, Подробнее здесь
В настоящее время я переносю свои приложения на этот новый API, но у меня возникла проблема сgetDerivedStateFromProps
, из-за того, что я использую библиотеку перекомпоновки для компонентов более высокого порядка. Мы используем componentWillReceive
пропускает через объект жизненного цикла библиотеки.
Поэтому, прежде чем перейти к новому API, у меня было следующее:
export function someHoC () {
return compose(
lifecycle({
componentWillReceiveProps (nextProps) {
const { fetch } = nextProps
if (shouldFetch(this.props, nextProps)) {
fetch()
}
}
})
)
}
Теперь это изменилось на следующее:
export function someHoC () {
return compose(
lifecycle({
getDerivedStateFromProps (nextProps) {
const { fetch } = nextProps
if (shouldFetch(this.props, nextProps)) {
fetch()
}
}
})
)
}
Тем не мение, getDerivedStateFromProps
должен быть статичным, поэтому я получаю предупреждение об этом и не знаю, как с этим справиться.
warning.js? 7f205b4: 33 Предупреждение: жизненный цикл (MyComponent): getDerivedStateFromProps() определен как метод экземпляра и будет игнорироваться. Вместо этого объявите это как статический метод.
Что я могу сделать, чтобы передать его как статический метод жизненного цикла в мой компонент?
2 ответа
Если вы хотите использовать getDerivedStateFromProps
вам нужно объявить это как статический метод:
static getDerivedStateFromProps() {...}
Очевидно, это делает getDerivedStateFromProps
статический, что означает, что вы не можете назвать это так же, как вы могли бы назвать componentWillReceiveProps
,
Если статический метод не работает для вас, вы можете переместить свою логику в componentDidUpdate
заставить замолчать предупреждение. Однако это может вызвать дополнительный рендер, если вы позвоните setState()
из этого метода. В зависимости от того, что происходит, когда вы решаете fetch()
это может работать для вас.
Вы также можете заменить componentWillReceiveProps
с UNSAFE_componentWillReceiveProps
( документы), который будет работать так же. Однако из-за предстоящей функции асинхронного рендеринга это может вызвать некоторые проблемы.
Вы должны использовать следующее в вашем жизненном цикле
setStatic('getDerivedStateFromProps', (nextProps, prevState) => {})
и сохранить предыдущие значения в состоянии компонента для извлечения его из prevState
аргумент