如何在 React 组件中加载新的 axios 数据
How to load new axios data in react component
我有一个导航菜单,可以使用 <Link to={"/entity"}>Entities</Link>
正确加载带有 react-router 的组件
组件使用axios加载数据并显示在表格中。我正在努力完成的是在随后单击 <link>
时加载新数据。
class List extends Component {
constructor() {
super();
this.state = { entities: [], loading: true};
}
componentDidMount() {
this.getData();
console.log('componentDidMount');
console.log(this.state.entities);
}
getData() {
axios.get(this.props.url).then(response => {
this.setState({ entities: response.data, loading: false})
})
}
render() {
...
}
这适用于加载单组数据。但是,如果我编辑一行并再次打开列表,它将具有最初检索到的内容。给出该代码哪个是正确的行为,但我如何重新加载它?我试过 componentDidUpdate 但这会创建一个无限循环。我假设由于 componentDidUpdate 改变了 DOM 然后再次调用 componentDidUpdate。
componentDidUpdate(prevProps) {
this.getData();
console.log('componentDidUpdate');
}
我考虑过将 onClick={this.handleClick}
添加到菜单并更改状态或传递值以指示新的点击。但是必须有一种方法可以从路由器捕获更新,而不仅仅是组件的更改。
If you use setState
inside componentDidUpdate
it updates the component, resulting in a call to componentDidUpdate
which subsequently calls setState
again resulting in the infinite loop. You should conditionally call setState
and ensure that the condition violating the call occurs eventually e.g:
componentDidUpdate(previousProps, previousState) {
if (previousProps.data !== this.props.data) {
this.setState({/*....*/})
}
}
我想出的解决方案是向 link 添加时间戳并将其与之前的时间戳进行比较。
<Link to={{"/entity", state: { update: + new Date() } }}>Entities</Link>
componentDidUpdate(prevProps, prevState) {
if (prevProps.update !== this.props.update) {
this.setState({ loading: true })
this.getData();
//console.log('Data Updating - ' + this.props.update);
}
}
我有一个导航菜单,可以使用 <Link to={"/entity"}>Entities</Link>
组件使用axios加载数据并显示在表格中。我正在努力完成的是在随后单击 <link>
时加载新数据。
class List extends Component {
constructor() {
super();
this.state = { entities: [], loading: true};
}
componentDidMount() {
this.getData();
console.log('componentDidMount');
console.log(this.state.entities);
}
getData() {
axios.get(this.props.url).then(response => {
this.setState({ entities: response.data, loading: false})
})
}
render() {
...
}
这适用于加载单组数据。但是,如果我编辑一行并再次打开列表,它将具有最初检索到的内容。给出该代码哪个是正确的行为,但我如何重新加载它?我试过 componentDidUpdate 但这会创建一个无限循环。我假设由于 componentDidUpdate 改变了 DOM 然后再次调用 componentDidUpdate。
componentDidUpdate(prevProps) {
this.getData();
console.log('componentDidUpdate');
}
我考虑过将 onClick={this.handleClick}
添加到菜单并更改状态或传递值以指示新的点击。但是必须有一种方法可以从路由器捕获更新,而不仅仅是组件的更改。
If you use
setState
insidecomponentDidUpdate
it updates the component, resulting in a call tocomponentDidUpdate
which subsequently callssetState
again resulting in the infinite loop. You should conditionally callsetState
and ensure that the condition violating the call occurs eventually e.g:
componentDidUpdate(previousProps, previousState) {
if (previousProps.data !== this.props.data) {
this.setState({/*....*/})
}
}
我想出的解决方案是向 link 添加时间戳并将其与之前的时间戳进行比较。
<Link to={{"/entity", state: { update: + new Date() } }}>Entities</Link>
componentDidUpdate(prevProps, prevState) {
if (prevProps.update !== this.props.update) {
this.setState({ loading: true })
this.getData();
//console.log('Data Updating - ' + this.props.update);
}
}