reactjs - reactjs - 处理复选框(多个)单击事件
问题描述
我知道有一些类似的主题,但似乎没有一个与我尝试做的方向相同,因此是一个新线程。
我有一个显示键列表的组件,每个键都有一个附加到字符串的复选框。此外,我有一个按钮,据说它调用一个 API 并选择了所有键并删除这些键。
我想要实现的几件事:
- 选中复选框启用删除按钮
- 单击删除按钮应向 API 发送 POST,然后列表应重新加载
- 由于列表被重新加载,所有复选框都应该被取消选中,因此删除按钮再次被禁用
- 此函数之外还有另一个按钮,用于检查列表的长度,如果我在组件中获取列表,我不知道如何与此列表关联。
我面临的问题是我不知道如何使按钮和复选框相互关联。我尝试将 state 与 state 一起使用checked
,它是一个布尔值,但这只是一个布尔值,不能记录多个键。我认为使用数组会起作用吗?然后我又不确定如何正确附加或删除检查的密钥。
我的代码看起来像
class AppList extends Component {
constructor() {
super();
this.state = {
checked: [],
apps: []
};
this.handleChecked = this.handleChecked.bind(this);
}
componentDidMount() {
fetch("some_url", {
method: 'post',
body: JSON.stringify({"user": "some_email"}),
headers: {'Content-Type': ' application/json'}
})
.then(res => res.json())
.then(
(result) => {
this.setState({apps: JSON.parse(result)});
},
(error) => {
console.log("error", error);
}
);
}
handleDeleteKey = (event) => {
// fetch(I'll worry about this later)
this.setState({checked: false});
console.log("delete!!!!");
}
handleChecked () {
this.setState({checked: !this.state.checked});
}
render () {
const apps = this.state.apps.map((app) =>
<div>
<input type="checkbox" onChange={this.handleChecked} />
{` ${app}`}
</div>
);
return (
<div>
<h4>Client Key List:</h4>
{this.state.apps.length > 0 ? <ul>{apps}</ul> : <p>No Key</p>}
{this.state.apps.length > 0 ? <button className="api-instruction-button" onClick={this.handleDeleteKey}>Delete Selected Key(s)</button> : null}
</div>
);
}
}
export default AppList;
我觉得我的设计完全错误,但我不知道如何修复它。似乎有这么多的状态要传递,没有什么是最外层的,几乎是循环依赖。
任何人都有处理这个问题的经验吗?这似乎是一个常见的用户操作,但我无法弄清楚。
编辑:在深入挖掘之后,似乎我需要componentDidMount
在AppList
. 它应该在使用的组件中AppList
,我们称之为它MainApp
。
MainApp
调用componentDidMount
与AppList
. 一个 inAppList
被删除,键作为道具传递给 AppList。
我无法处理点击事件。似乎组件总是在更新,所以如果我想将点击的键附加到数组中,它就行不通了。将一次又一次地发出相同的呼叫。
由于其中还有另一个按钮MainApp
需要键列表,因此我不能只将调用传递给AppList
. 但是,更新AppList
也应该更新MainApp
。它是如何工作的?我很混乱
EDIT2: https ://codesandbox.io/s/7w2w11477j
这个游戏应该包含我目前拥有的所有功能,但我无法让它们一起工作。
我的任务很简单:
- 我有一个字符串列表,每个都有一个复选框
- 检查复选框选择特定字符串
- 有一个按钮,我可以单击以通过调用 API 来删除我的数据库中的这些条目
- 在这种情况下是否需要刷新 MainApp?否则我需要删除前端的字符串,以便在按下删除按钮后它们不会显示
解决方案
这就是我相信你想要的:https ://codesandbox.io/s/w23wv002yw
使您无法正常工作的唯一问题是您只是在放置所有东西的地方有点混乱。
内容:
将MainApp.js
仅包含apps
和 用于在后端删除它们的方法。除了这两种方法之外,没有其他真正与MainApp.js
文件有关的内容。
将AppList.js
包含更新其自身checked
状态的所有方法、删除按钮本身以及checked
在删除时清除状态的方法。
流程:
首先,MainApp.js
将使用后端 api pull 加载和重新安装并填充其apps
状态。完成后,它将传递给AppList.js
. 从那里,AppList.js
将该列表呈现为屏幕上的多选字段。然后用户可以选择或取消选择任何选项。当一个选项被选中时,它的索引被推送到checked
状态并按升序组织。
(订购阵列并不是那么必要,但我认为如果您想在以后的某个时候对其进行重新装备,这会有所帮助)
When one or more option is selected, a delete
button will appear. 当用户单击delete
按钮时,AppList.js
将调用从delete
传递给它的函数MainApp.js
,然后将清除当前checked
状态。
推荐阅读
- r - 我写了一个函数,但它没有给出我期望的输出
- nodes - EJS 中的局部变量
- apache-spark - 具有特定值之前的分析函数
- java - Spring/Java11 - 由于缺少 ServletWebServerFactory bean,无法启动 ServletWebServerApplicationContext
- gitlab - GitLab:所选阶段不存在
- .net-core - 用于协调本地和网络集群的最佳 .Net Actor/Process 框架
- artifactory - 使用 Xray Report API 获取报告 pdf
- python - 一个列表未正确保存在另一个、Python、networkx 中
- javascript - 生成 SHA256 哈希的等效 JavaScript 代码
- java - Tomcat 9 JMX RMI 认证漏洞