我知道有一些类似的主题,但是似乎没有一个方向与我要尝试的方向相同,因此是一个新主题。
我有一个显示键列表的组件,每个键都有一个附加到字符串的复选框。另外,我有一个按钮,该按钮应该调用所有已选择键的API并删除这些键。
我要实现的几项目标:
我遇到的问题是我不知道如何使按钮和复选框相互关联。我尝试使用带有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
中的相同。 AppList
中的一个被删除,并且密钥作为道具传递给AppList。
我无法处理点击事件。似乎该组件一直在更新,因此如果我想将单击的键附加到数组上,它将无法正常工作。将会一次又一次地拨打相同的电话。
由于MainApp
中还有另一个按钮需要键列表,因此我不能只是将通话转接到AppList
中。但是,在AppList
中进行更新也应同时更新MainApp
。它是如何工作的?我很困惑
EDIT2: https://codesandbox.io/s/7w2w11477j
此娱乐活动应该包含我到目前为止拥有的所有功能,但是我无法让它们一起工作。
同样,我的任务很简单:
答案 0 :(得分:1)
我相信这是您要去的地方:https://codesandbox.io/s/w23wv002yw
使您的笔记本无法正常工作的唯一问题是,您只是对放置所有内容的位置有些混乱。
内容:
MainApp.js
仅包含apps
以及在后端删除它们的方法。除了这两种方法,MainApp.js
文件没有其他真正的问题。
AppList.js
将包含所有更新其自身checked
状态的方法,删除按钮本身以及在删除时清除checked
状态的方法。
过程:
首先,MainApp.js
将使用后端api pull加载并重新安装,并填充其apps
状态。完成后,它将传递给AppList.js
。从AppList.js
开始,该列表将在屏幕上显示为多选字段。然后,用户可以选择或取消选择任何选项。选择一个选项后,其索引将推入checked
状态并按升序进行组织。
(排序数组不是必需的,但我认为如果您想在以后的某个时间对其进行重新组装,这将有所帮助)
选择一个或多个选项时,将显示一个delete
按钮。当用户单击delete
按钮时,AppList.js
将调用从delete
传递给它的MainApp.js
函数,然后它将清除当前的checked
状态。 / p>