我想构建一个表单生成器系统。我有一个名为setLabel
的全局函数,该函数绑定到名为InputBox
的组件并更改其状态。此全局函数由另一个名为ModalPanel
的组件触发,该组件控制绑定的组件InputBox
上的可编辑属性。为了简化这个问题,我简化了函数和组件类;
这是全局函数;
function setLabel(postID, attributeName ){
var text = 'example';
if(text !== ''){
this.setState({ [attributeName] : text});
}
}
这是绑定到setLabel
函数的组件。请注意,如何将setLabel
函数作为属性从父InputBox
组件传递给子ModalPanel
组件函数。
class InputBox extends Component{
constructor(props){
super(props);
this.state = {
placeholder : '',
maxlength: '',
type: '',
}
this.setLabel = setLabel.bind(this); // Binding this to the global function.
}
render(){
let elementId = "inputElement-" + this.props.idCounter;
let mainElement = <Form.Control id = {elementId} type={this.state.type}
placeholder = {this.state.placeholder}
maxLength = {this.state.maxlength}
/>
return <Row>
<ModalPanel handleHide = {this.props.handleHide} handleShow = {this.props.handleShow} setLabel = {this.setLabel}/>
</Row>
}
}
最后,下面是ModalPanel
组件函数,其中触发了setLabel
函数。
function ModalPanel(props){
return(
......................
......................
......................
<Button variant="primary" onClick = {() => props.setLabel()}>Save changes</Button>
......................
......................
......................)
}
在setLabel
组件中单击按钮时,必须触发旨在设置InputBox
状态的 ModalPanel
函数。问题是,窗口上呈现了多个<InputBox />
组件,当我尝试使用此功能时,“状态更改”仅影响<InputBox />
组件的第一个实例。我想做的是,每个实例都应该具有自己的内部状态,并且setLabel()
函数应该绑定到从其调用的特殊组件上。因此,该功能可以设置不同组件实例的状态。我该怎么办?
谢谢。
添加:
请检查下面的链接,以查看gif,我的系统工作不正常。如您所见,即使我选择第三个输入框元素来编辑其属性(在本例中,设置其占位符文本),更改仍在第一个输入框上进行;