【发布时间】:2019-02-13 12:37:50
【问题描述】:
我有两个组件,App 和 Child。我的目标是 App 将 id 传递给 Child,当 Child 将其作为道具接收时,我希望 Child 执行 Axios/Fetch 请求,然后使用结果数据更新自身。我将接受任何为我提供示例 App/Child 源代码的答案,以完成我的示例或提供我的见解,如果这实际上可能是我正在尝试实现的。
我是 React 新手。
// App.js
import React, { Component } from 'react';
import Child from './Child.js';
import './App.css';
class App extends Component {
state = {
id: 0
};
handleClick() {
this.setState({
id: this.state.id + 1
});
}
render() {
return (
<div>
<Child id={this.state.id} />
<div>
<button onClick={this.handleClick.bind(this)}>Pass new id down to Child component</button>
</div>
</div>
);
}
}
export default App;
// Child.js
import React, { Component } from 'react';
import axios from 'axios';
class Child extends Component {
state = {
data: null,
id: 0
};
loadData(q, cb) {
axios.get('http://localhost:3000/foo?q='+this.state.id)
.then(result => {
// ?
// this.setState would retrigger update and create an infinite updating loop
})
.catch(error => {
console.log('error: ' + error);
});
}
shouldComponentUpdate(nextProps, prevState) {
console.log('shouldComponentUpdate: nextProps = ' + JSON.stringify(nextProps) + ', prevState = ' + JSON.stringify(prevState));
// ??
}
getSnapshotBeforeUpdate(nextProps, prevState) {
console.log('getSnapshotBeforeUpdate: nextProps = ' + JSON.stringify(nextProps) + ', prevState = ' + JSON.stringify(prevState));
// ??
}
static getDerivedStateFromProps(nextProps, prevState) {
console.log('getDerivedStateFromProps: nextProps = ' + JSON.stringify(nextProps) + ', prevState = ' + JSON.stringify(prevState));
return {
id: nextProps.id
};
// ??
}
componentDidUpdate() {
console.log('componentDidUpdate');
}
render() {
return (
<div>
<div>data = {this.state.data}</div>
</div>
);
}
}
export default Child;
【问题讨论】:
-
在
componentDidUpdate()中,比较prevProps.id和this.state.id。如果它们不同,请致电loadData()。 (我也看不出你的电流怎么会造成无限循环?) -
因为 loadData 触发 setState 最终会触发 componentDidUpdate
-
但这还没有循环。为了让它成为一个循环,
componentDidUpdate()必须总是调用loadData()。但这不会发生,只有当id发生变化时。已经 7 周了,你还在坚持这个,甚至没有尝试我的建议吗?
标签: javascript reactjs components