【发布时间】:2021-04-09 08:15:48
【问题描述】:
我正在尝试使用 ReactJS 创建一个简单的表格来显示用户信息。下面是一般代码结构的样子:
class ParentComponent extends React.Component {
state = {
data : []
}
componentDidMount() {
// initializes state with data from db
axios.get("link/").then(res => {
this.setState({data: res.data});
});
// I should be able to call this.getData() instead
// of rewriting the axios.get() function but if I do so,
// my data will not show up
}
// retrieves array of data from db
getData = () => {
axios.get("link/").then(res => {
this.setState({data: res.data});
});
}
render() {
return (
<div>
<ChildComponent data={this.state.data} refetch={this.getData} />
</div>
)
}
}
每个生成的行都应该有一个删除函数,我将根据给定的 id 从数据库中删除条目。删除后,我想从父组件中检索最新的数据重新显示。
class ChildComponent extends React.Component {
// deletes the specified entry from database
deleteData = (id) => {
axios.get("deleteLink/" + id).then(res => {
console.log(res);
// calls function from parent component to
// re-fetch the latest data from db
this.props.refetch();
}).catch(err => {console.log(err)});
}
render() {
let rows = null;
if(this.props.data.length) {
// map the array into individual rows
rows = this.props.data.map(x => {
return (
<tr>
<td>{x.id}</td>
<td>{x.name}</td>
<td>
<button onClick={() => {
this.deleteData(x.id)
}}>
Delete
</button>
</td>
</tr>
)
})
}
return (
<div>
<table>
<thead></thead>
<tbody>
{rows}
</tbody>
</table>
</div>
)
}
}
我在这里遇到的两个问题是:
- 从逻辑上讲,我应该能够从 componentDidMount() 中调用 this.getData(),但如果我这样做,则不会加载表。
- 每当我尝试删除一行时,即使条目已从数据库中删除,表也不会反映更新。只有当我刷新页面或删除另一行时,该表才会更新。问题是,组件总是落后 1 次更新。
到目前为止我已经尝试过:
-
this.forceUpdate()- 不起作用 -
this.setState({})- 空 setState 也不起作用 - 将
componentDidMount()更改为componentDidUpdate()- 错误显示我已“达到最大深度”或沿着这条线的东西 - 在 axios 前面添加异步等待 - 不起作用
感谢任何帮助。提前致谢。
编辑:我进行了一些调试并追踪了与我的问题无关的问题。我位于 ChildComponent 中的 deleteData() 使用 axios.post() 而不是 axios.get(),我忽略了。
deleteData = (id) => {
axios.post("deleteLink/", id).then(res => {
console.log(res);
// calls function from parent component to
// re-fetch the latest data from db
this.props.refetch();
}).catch(err => {console.log(err)});
}
为了让axios.post() 返回响应,为了执行.then(),您需要在路由代码中添加res.json()。
【问题讨论】:
-
api调用后能登录res吗?更新状态时看起来也很奇怪,是不是错字?应该是
this.setState({data: res.data}) -
是的,这是我的错字。响应包含通常的标头、数据数组和状态 200 - 这没有什么不寻常的。当我单击删除按钮时,deleteData() 函数确实运行了。但是,在我删除另一行之前,它不会触发组件重新渲染。