ReactJS - Ajax 在子组件中
ReactJS - Ajax in the sub component
我正在使用 React + nextJS 开发一个简单的网站。
为简单起见,假设我有 2 个下拉菜单。
Dropdown A (country)
- Dropdown B (run time options based on the country selection)
下拉菜单 A 在主页上。下拉 B 是一个单独的 component.I 设计了我的组件,如图所示。
class MySubComponent extents Component{
state = {
options: []
}
static async getDerivedStateFromProps(props){
let options = await axios(....);
console.log(options)
return {options};
}
render(){
<div>
{this.state.options}
</div>
}
}
首页包含MySubComponent
首页
<MySubComponent loadOptionBfor={dropdownAvalue} />
下拉列表 A 的 OnChange 事件应该重新加载下拉列表 B。我看到控制台日志语句显示我获得了 B 的选项。然而,在 ajax 请求完成之前,MySubComponent
会在没有任何选项的情况下呈现。
如何解决这个问题?
getDerivedStateFromProps
"should return an object to update the state, or null to update nothing",它只能同步执行。
我认为你最好在 componentDidUpdate
中比较当前的道具和以前的道具,如果你想比较的道具发生变化,就得到你的新选项。
例子
class MySubComponent extends Component {
state = {
options: []
};
async componentDidUpdate(prevProps) {
if (prevProps.country !== this.props.country) {
let response = await axios(/* ... */);
this.setState({ options: response.data });
}
}
render() {
return (
<select>
{this.state.options.map(option => (
<option key={option} value={option}>
{option}
</option>
))}
</select>
);
}
}
我正在使用 React + nextJS 开发一个简单的网站。
为简单起见,假设我有 2 个下拉菜单。
Dropdown A (country)
- Dropdown B (run time options based on the country selection)
下拉菜单 A 在主页上。下拉 B 是一个单独的 component.I 设计了我的组件,如图所示。
class MySubComponent extents Component{
state = {
options: []
}
static async getDerivedStateFromProps(props){
let options = await axios(....);
console.log(options)
return {options};
}
render(){
<div>
{this.state.options}
</div>
}
}
首页包含MySubComponent
首页
<MySubComponent loadOptionBfor={dropdownAvalue} />
下拉列表 A 的 OnChange 事件应该重新加载下拉列表 B。我看到控制台日志语句显示我获得了 B 的选项。然而,在 ajax 请求完成之前,MySubComponent
会在没有任何选项的情况下呈现。
如何解决这个问题?
getDerivedStateFromProps
"should return an object to update the state, or null to update nothing",它只能同步执行。
我认为你最好在 componentDidUpdate
中比较当前的道具和以前的道具,如果你想比较的道具发生变化,就得到你的新选项。
例子
class MySubComponent extends Component {
state = {
options: []
};
async componentDidUpdate(prevProps) {
if (prevProps.country !== this.props.country) {
let response = await axios(/* ... */);
this.setState({ options: response.data });
}
}
render() {
return (
<select>
{this.state.options.map(option => (
<option key={option} value={option}>
{option}
</option>
))}
</select>
);
}
}