javascript - 在 POST 请求后反应从状态中的数组中删除项目
问题描述
我有一个反应组件,它在加载时从 api 端点获取“问题”列表。然后将它们显示在表格中。单击一个元素时,它会发送一个 POST 请求,告诉该服务器问题已解决。这一切都很好,但是现在,如果 POST 请求返回 200,我需要它从状态中删除该问题(因此从表中删除)。我试过下面的代码,但它说它无法读取行上未定义的属性“状态” this.state.issues
,这表明它不知道“这个”是什么。
class IssueScreen extends Component {
constructor(props) {
super(props);
this.state = {};
}
componentDidMount() {
fetch(`${apiRoot}/${this.props.match.params.id}`, {
method: "GET",
headers: {
Accept: "application/json",
"Content-Type": "application/json",
Authorization: `Token ${this.props.auth.token}`
}
})
.then(response => response.json())
.then(response =>
this.setState({
id: response.id,
issues: response.issues
})
);
}
resolveIssue(issueID) {
fetch(`${apiRoot}resolve_issue/`, {
method: "POST",
headers: {
Accept: "application/json",
"Content-Type": "application/json",
Authorization: `Token ${this.props.auth.token}`
},
body: JSON.stringify({
id: issueID
})
}).then(function(res) {
if (res.status === 200) {
for (var i = 0; i < this.state.issues.length - 1; i++) {
if (this.state.issues[i].id === issueID) {
this.setState({ issues: this.state.issues.splice(i, 1) });
}
}
} else {
console.log("Problem");
}
});
}
被resolveIssue
调用:
this.resolveIssue(id);
在代码中进一步。
解决方案
首先将您的函数表达式更改为箭头函数,因此this
将指向正确的命名空间。
resolveIssue = (issueID) => {
还有屁股:
.then((res) => {
其次,Array#splice
就地工作,这意味着将直接改变状态。在正确绑定你的resolveIssue
函数或只是将其更改为箭头函数后,你的应用程序可能会由于mutation state
错误而崩溃。我建议你spread syntax
改用。
就像是:
this.setState({ issues:
[...this.state.issues.slice(0, i), ...this.state.issues.slice(i + 1)],
});
推荐阅读
- android - 将屏幕显示从 Android Emulator 重定向到服务器
- python - 在 Python3 二进制字符串中允许空字节
- azure - 将 Azure AD MFA 与 Citrix ADC 结合使用
- javascript - 输入与 Array 对象的匹配值
- c++ - 双向链表
- json - swift: 字典到 json
- .net - ASP.NET Core (Razor Pages) - 将文件上传添加到现有表单
- javascript - 无法读取未定义的 Vue js 的属性“值”
- neo4j - 尝试创建一个新节点,该节点必须具有所有节点及其标签和属性
- visual-studio-code - 如何修复“mypy failed with error: Daemon has dead 。有关详细信息,请参阅输出面板。” VS 代码中的错误