如何结合复选框与文本输入reactjs
我想在Reactjs中构建一个Ui组件,它将一个复选框和一个文本输入合并到它(而不是文本标签),这样如果复选框被选中,用户可以改变文本输入,如果未选中,用户将不能这样做 最终目标是在组件外部呈现所有textinput值,这些值将作为列表或作为菜单项进行检查。 它应该看起来像这样: Checkbox with Text input如何结合复选框与文本输入reactjs
任何人都知道我该怎么做? im新的reactjs和有点困惑如何传递两个组件之间的逻辑(如在这里复选框和文本输入之间,“组合”组件和外部渲染列表之间)。 在此先感谢!
EDIT1: 以及我设法构建组件,但我不能让孩子们调用父处理器(handlerCheckbox,handlerInput),以便实际上使魔术发生。
什么即时做错了?
这是孩子:
class CheckboxTxtInput extends React.Component{
constructor(props){
super(props);
console.log(props.isChecked)
}
handleCheckboxChild(e) {
this.props.handleCheckbox(e,this.props.id)
}
handleInputChild(e){
this.props.handleInput(e,this.props.id)
}
render(){
return (
<div>
<input type="checkbox" onChange={this.handleCheckboxChild} defaultChecked={this.props.isChecked} />
<input type="text" value={this.props.inputValue} disabled={!this.props.isChecked} onChange={this.handleInputChild}/>
</div>
)
}
}
这是父:
export default class Text extends React.Component {
constructor(props) {
super(props);
this.state = {
textItems: [{id:0,inputValue:'text',isChecked:true},{id:1,inputValue:'text',isChecked:true}
,{id:2,inputValue:'text',isChecked:true},{id:3,inputValue:'text',isChecked:true}]
};
this.handleCheckbox = this.handleCheckbox.bind(this);
this.handleInput= this.handleInput.bind(this);
}
handleCheckbox(e,id) {
var stateCopy = Object.assign({}, this.state);
stateCopy.textItems[id].isChecked = e.target.value;
this.setState(stateCopy);
}
handleInput(e,id){
var stateCopy = Object.assign({}, this.state);
stateCopy.textItems[id].text = e.target.value;
this.setState(stateCopy);
}
render() {
return (
<div>
<hr className="divider-long"/>
<UI.sectionDividerLabeled label="Show/Hide Text"/>
<hr className="divider-long"/>
<p>Here you can show\hide your text</p>
<div>
<CheckboxTxtInput id={this.state.textItems[0].id} isChecked={this.state.textItems[0].isChecked}
inputValue={this.state.textItems[0].inputValue} handleInput={this.handleInput}
handleCheckbox={this.handleCheckbox} />
<CheckboxTxtInput id={this.state.textItems[1].id} isChecked={this.state.textItems[1].isChecked}
inputValue={this.state.textItems[1].inputValue} handleInput={this.handleInput}
handleCheckbox={this.handleCheckbox}/>
<CheckboxTxtInput id={this.state.textItems[2].id} isChecked={this.state.textItems[2].isChecked}
inputValue={this.state.textItems[2].inputValue}
handleInput={this.handleInput} handleCheckbox={this.handleCheckbox}/>
<CheckboxTxtInput id={this.state.textItems[3].id} isChecked={this.state.textItems[3].isChecked}
inputValue={this.state.textItems[3].inputValue} handleInput={this.handleInput}
handleCheckbox={this.handleCheckbox}/>
</div>
<RenderText />
</div>
)
}
}
最简单的,阵营样的方式做,这是有一个父包装组件 - 例如LabeledCheckbox
其中包含您的文本输入和您的复选框组件。
当任何一个子组件执行某些操作时,它们会调用父级提供的回调,并且父级维护这两个组件的状态,并将该状态传递给两个子级的道具。
在这种情况下,孩子们永远不会保持自己的状态,而只是调用回调并被道具喂养。
使用复选框和输入字段创建一个组件,其中包含复选框和文本字段的状态。
然后你可以在你想要的地方重复使用它。
你可以做这样的事情:
class CheckboxTxtInput extends React.Component{
constructor(){
super();
this.state = {
checkbox: false,
inputValue: ""
}
}
handleCheckbox(e){
this.setState({checkbox: e.target.checked})
}
handleInput(e){
this.setState({inputValue: e.target.value})
}
render(){
return (
<div>
<input type="checkbox" onChange={this.handleCheckbox.bind(this)} checked={this.state.checkbox}/>
<input type="text" value={this.state.inputValue} disabled={this.state.checkbox} onChange={this.handleInput.bind(this)}/>
</div>
)
}
}
class Test extends React.Component {
render(){
return (
<div><CheckboxTxtInput /></div>
)
}
}
React.render(<Test />, document.getElementById('container'));
希望这有助于。
感谢兄弟你真的帮助了我!有没有机会帮助我编辑部分的帖子?提前致谢 ! –
提问新问题。这是你第一个问题的答案。 – Boky
所以让我知道如果我让你直。我需要制作2个组件(一个用于复选框,另一个用于文本输入),然后用第三个组件作为父组件包装起来?复选框组件和文本输入组件应该与状态?或者只是父母?即时通讯有困难如何Parnet控制儿童(如输入文本字段知道它可以启用,如果复选框已被选中)感谢兄弟 –
是的,这是正确的。在两个孩子中没有状态,只在父母身上。只需使用道具将父母的状态传递给每个孩子 – Chris