我正在尝试创建一个RadioInput组件,但是当我添加一个回调来设置父级内部的状态时,按钮不会保持单击状态 .
在RadioInput组件渲染功能的内部,我正在创建内部按钮,如下所示:
this.props.buttons.map( (button) => {
return (
<div ...>
<Button clickedDown={this.state.selectedButton === button} clickAction={() => this.radioSelected(button)}.../>
</div>
)
}
然后,无线电选择功能设置内部无线电输入状态,使单击的按钮成为选定按钮,并调用传递给子节点的功能,以便将选项的值提供给父节点
radioSelected = (button) => {
if (this.state.selectedButton !== button) {
this.setState({selectedButton: button}, () => {
this.props.clickAction(this.state.selectedButton);
}
}
}
RadioInput在父级内部声明如下:
render () {
const buttonList = [
{ color:'green', text:'Green', id: 1 },
{ color:'blue', text:'Blue', id: 2 },
{ color:'purple', text:'Purple', id: 3 }
];
return (
<RadioInput buttons={buttonList} clickAction={this.radioAction}/>
)
}
由RadioInput的内部radioSelected函数调用的radioAction函数如下所示:
radioAction = (button) => {
this.setState({
team: button.color
});
}
如果从无线电输入中的 setState
中删除 this.props.clickAction(this.state.selectedButton);
,它将正常工作 . 如果我正确地删除了父母 radioAction()
内的 setState
. 为什么链接的setStates会导致错误,例如阻止 clickedDown={this.state.selectedButton === button}
不被重新评估?
任何帮助表示赞赏!
2 回答
Tl;博士;
将
buttonList
(const buttonList = ...
)的初始化从render
函数移动到构造函数或在每个渲染上不更改数组的任何其他位置 .解释
在您的父级中,每次调用
render
时都会重新初始化buttonList
. 因此,每次调用父级的render
之后,您都会有一个不同的buttonList
,因为它每次都是一个新创建的对象 .现在,您的
radioAction
函数在parent上调用setState
,它调用render
并有效地将buttonList
的所有项目更改为新的项目数组 . 肯定this.state.selectedButton
不等于它们中的任何一个,因为它是前一个数组中的一个项目 .您的
clickAction
没有收到参数:它打破了,因为你用一个参数调用它同时
clickAction
prop没有收到你的参数,所以它只是没有收到this.state.selectedButton
所以,它应该是: