想象一个带有<select>
元素的简单React组件,该组件允许根据国家/地区选择城市。例如
<MyCitySelectComponent
country={ 'France' }
city={ 'Paris' }
onChange={ someFunction }
/>
<select>
。<select>
输入值并触发onChange事件。我设法实现了前两个,这是简化的代码:
class MyCitySelectComponent extends Component {
constructor(props) {
super(...props);
this.state = {
cities: null,
city: props.city,
country: props.country
};
}
onCityChange( e ) {
this.setState({
city: e.target.value
});
this.props.onChange( e.target.value );
}
loadCities() {
fetch({
path: '/get/cities?country=' + this.state.country,
}).then( cities => {
this.setState({
cities: cities
});
});
}
componentDidMount() {
this.loadCities();
}
render() {
if ( !this.state.cities ) {
// not loaded yet
return null;
}
return (
<select>
{ this.state.cities.map( ( name, index ) =>
<option
value={ name }
onChange={ this.onCityChange }
selected={ name === this.state.city }
/>
) }
</select>
)
}
}
但是当从上级组件动态更改国家/地区时,我在重新加载城市时遇到麻烦。我尝试使用shouldComponentUpdate
,但得到的只是无限循环。
这种类型的组件有任何模式吗?
谢谢。
答案 0 :(得分:1)
应根据componentDidUpdate
或getDerivedStateFromProps
处理基于道具更改来获取新数据。查看示例文档:https://reactjs.org/blog/2018/03/27/update-on-async-rendering.html#fetching-external-data-when-props-change
请注意,componentWillReceiveProps
已过时!