reactjs - axios调用React后如何强制孩子重新渲染?
问题描述
我正在处理带有交互式输入的表单。他们必须通过信息将自己实现为父状态。
我使用 Axios 来获取要显示的数据,从外部 API 获取它们。我尝试设置默认值,但它们从未使用较新的值实现。
class Form extends React.Component {
getData() {
axios.get('http://xxx/getform/').then(
res => this.setState(res.data)
);
}
componentDidMount() {
this.getData();
setInterval(() => {
this.getData();
}, 36000000)
}
render() {
return (
<div>
<form>
<DatePicker />
</form>
</div>
)
}
}
class DatePicker extends React.Component {
constructor(props) {
super(props);
this.state = {
selected: new Date(),
runMin: new Date(),
runMax: new Date()
};
}
getDate() {
console.log('DAD');
try { // if axios didn't finish, to avoid undefined
this.setState({
runMin: super.state.RunMin,
runMax: super.state.RunMax})
} catch (e) {
this.setState({
runMin: new Date(),
runMax: new Date()})
}
}
componentDidMount() {
this.getDate();
this.setState({selected: this.state.runMax});
}
render() {
return (<div></div>);
}
}
实际上,在 axios 调用之后,孩子们并没有重新渲染。我分离了对 axios 的调用和使用它的组件,因为该Form
组件对多个子级进行了一次调用(此处未显示),并且它们读取父级的状态进行渲染。
解决方案
首先,您不应该使用访问父母状态super
,而是将所需的值作为道具传递
其次,componentDidMount 生命周期在初始挂载时执行,因此当父状态更新时,其中的逻辑不会执行。
处理您的案件的正确方法是
class Form extends React.Component {
state = {
RunMin: new Date(),
RunMax: new Date()
}
getData() {
axios.get('http://xxx/getform/').then(
res => this.setState({RunMin: res.data.RunMin, RunMax: res.data.RunMax})
);
}
componentDidMount() {
this.getData();
setInterval(() => {
this.getData();
}, 36000000)
}
render() {
return (
<div>
<form>
<DatePicker runMin={this.state.RunMin} runMax={this.state.RunMax}/>
</form>
</div>
)
}
}
class DatePicker extends React.Component {
render() {
console.log(this.props.runMin, this.props.runMax);
return (<div></div>);
}
}
推荐阅读
- python - 如何使用 MatPlotLib 在循环中显示一组文件
- c++ - 检查纪元时间戳是否在 C++ 中给定的人类可读时间范围内
- java - 将 1GB 文件的内容流式传输到单列下的 sqlite 表
- python-3.x - Raspberry Pi:如何让 RPi.GIPO 与 Python 3.6 一起工作?
- angular - 基于 Web API 令牌的身份验证
- applescript - Applescript 邮件附件未发送
- vue.js - 如何让 VueJS + ESLint (Airbnb) + Prettier 一起工作?(VS代码)
- javascript - 无法在反应组件中使用 setState
- wordpress - 如何为 Woocommerce 类别和产品设置不同的缩略图大小
- vala - 如何覆盖vala中的属性?