gpt4 book ai didi

javascript - 如何在同级组件完成 API 请求后重新渲染 React 组件?

转载 作者:行者123 更新时间:2023-11-29 20:50:07 26 4
gpt4 key购买 nike

我想在加载 React 组件后更新同级元素。使用下面的示例,我想在加载 PopupTable 后将“数据尚未呈现”更改为“Hello world”。

我的问题是,如果我在 render() 调用期间尝试更改状态,我会收到一条警告告诉我不要这样做,处理此问题的正确方法是什么?

class PopupBase extends React.Component {
render() {
return (
<div>
<div>
The data has not yet rendered.
</div>
<DataProvider endpoint="products/ajax/get_products_from_pickle" render={data =>
// Once the code get to here, I want to update the div above
<PopupTable data={data}/>
}/>
</div>
)
}
}


class DataProvider extends Component {
static propTypes = {
endpoint: PropTypes.string.isRequired,
render: PropTypes.func.isRequired
};
state = {
data: [],
loaded: false,
placeholder : this.props.placeholder
};

componentDidMount() {
fetch(this.props.endpoint)
.then(response => {
if (response.status !== 200) {
return this.setState({placeholder: "Something went wrong"});
}
return response.json();
})
.then(data => this.setState({data: data, loaded: true}));
}

render() {
const {data, loaded, placeholder} = this.state;
return loaded ? this.props.render(data) : <div>{placeholder}</div>;
}
}

export default DataProvider;

最佳答案

其中一个解决方案是将您的代码更改为:

class PopupBase extends React.Component {
render() {
return (
<DataProvider
endpoint="products/ajax/get_products_from_pickle"
render={data =>
<div>
<div>
The data has { data ? "" : "not yet" } rendered.
</div>
<PopupTable data={data}/>
</div>
}/>);
}
}

更好的方法是将数据加载逻辑提取到高阶函数中。因此,您将拥有一个纯粹基于 props 进行渲染的纯 React 组件。另一个“包装器”组件(即 DataProvider)从 API 加载数据并将 data 属性提供给可视组件。

关于javascript - 如何在同级组件完成 API 请求后重新渲染 React 组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52378970/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com