Вызов метода в getDerivedStateFromProps в ReactJS
перед обновлением реагировать на версию 16.3
для вызова действия на основе изменений в реквизит я использую что-то вроде этого кода :
componentWillReceiveProps(nextProps){
if(this.props.country.length !== nextProps.country){
doSomething(); //example calling redux action
}
}
но в версии 16.3
of react componentWillReceiveProps
- это небезопасно, и мы должны использовать getDerivedStateFromProps
но он сказал, что эти методы должны возвращать объект, и я не знаю, как я могу имитировать то, что я делаю раньше с componentWillReceiveProps
делать getDerivedStateFrompProps
2 ответов
да, вам нужно вернуть объект, который является новым состоянием, которое является производным от nextProp
. Согласно документам:
getDerivedStateFromProps
должен возвращать объект в состояние обновления или null, чтобы указать, что новые реквизиты не требуют обновлений состояния.
но поскольку вы никоим образом не обновляете свое состояние внутри своего componentWillReceiveProps
, вы должны использовать componentDidUpdate
вместо getDerivedStateFromProps
:
componentDidUpdate(prevProps){
if ( prevProps.country !== this.props.country.length ) {
doSomething(); //example calling redux action
}
}
для этой ситуации это было хорошо для OP использовать componentDidUpdate
но я обнаружил, что мне нужно getDerivedStateFromProps
поэтому я должен был сделать свою пользовательскую функцию статической и вызвать ее, используя имя класса внутри getDerivedStateFromProps
. Что-то вроде этого:--5-->
componentDidMount() {
const something = ClassComponentName.runThisFunction();
this.setState({ updatedSomething: something });
}
static getDerivedStateFromProps(nextProps, prevState) {
if (nextProps.key !== prevState.key) {
return {
updatedSomething: ClassComponentName.runThisFunction()
};
}
return null;
}
static runThisFunction() {
//do stuff and return value
}
чтобы уточнить, это обновление состояния компонента при загрузке, а также при поступлении новых реквизитов. Это определенно вернуло меня к моим дням машинописи. Надеюсь, это поможет!