2017-01-07 14 views
0

Reactjs에 체크 상자와 텍스트 입력 대신 텍스트 레이블이 결합 된 Ui 구성 요소를 작성하려고합니다. 확인란을 선택하면 사용자가 텍스트 입력을 변경할 수 있습니다. 체크하지 않으면 사용자가 그렇게 할 수 없습니다. 최종 목표는 구성 요소 외부에서 목록으로 또는 메뉴 항목으로 체크 된 모든 textinputs valus를 렌더링하는 것입니다. 그 모양은 다음과 같아야합니다. Checkbox with Text input확인란과 텍스트 입력을 reactjs에서 결합하는 방법

아무도 모르게 어떻게해야합니까? 새로운 reactjs에 새롭고 두 컴퍼넌트 (여기서는 체크 박스와 텍스트 입력 사이, "콤보"구성 요소와 외부 렌더링 목록 사이) 사이에서 로직을 전달하는 방법을 조금 혼란스럽게 생각합니다. 미리 감사드립니다. !

EDIT1는 : 글쎄 구성 요소를 구축하는 데 성공하지만 난 아이들이 실제로 마법이 일어날 수 있도록하기 위해 부모 핸들러 (handlerCheckbox, handlerInput)를 호출 할 캔트.

뭐가 잘못 되었나요? 이것은이다

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> 

    ) 
} 

}

답변

0

간단한 작업을 수행하는, 반작용 같은 방법 :이 부모 인

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> 
    ) 
} 

}

:

아이입니다 상위 래퍼 구성 요소가 있습니다 (예 : LabeledCheckbox). 여기에는 텍스트 입력 및 확인란 구성 요소가 포함되어 있습니다.

자식 구성 요소 중 하나가 어떤 작업을 수행하면 부모가 제공 한 콜백을 호출하고 부모는 두 구성 요소의 상태를 유지하며 해당 상태를 두 자식의 소품으로 전달합니다.

이 경우 자식은 콜백을 호출하고 보조 명령을받는 대신 자신의 상태를 유지하지 않습니다.

+0

내가 당신을 똑바로 해줄 지 알려주세요. 두 개의 구성 요소 (하나는 체크 박스 용이고 다른 하나는 텍스트 입력 용)를 만들어서 부모 역할을하는 세 번째 구성 요소로 마무리해야합니까? 체크 상자 구성 요소와 텍스트 입력 구성 요소가 상태가 있어야합니까? 아니면 그냥 부모? 메신저가 어떻게 parnet이 아이들을 제어 하는지를 고민하는 데 어려움을 겪고있다. (체크 박스가 체크되어 있으면 입력 텍스트 필드가 어떻게 작동하는지 알 수있다.) 고마워. –

+0

네, 맞아. 두 자녀 중에는 부모가없는 상태가 없습니다. 간단히 소품을 사용하여 각 자녀의 부모에게 상태를 전달하십시오. – Chris

0

확인란 및 입력란의 상태와 함께 하나의 구성 요소를 생성하십시오.

그런 다음 원하는 위치에서 다시 사용할 수 있습니다.

당신은 같은 것을 할 수 있습니다 :이 도움이

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')); 

Here is the fiddle.

희망을.

+0

당신이 정말로 나를 도왔습니다! 당신이 게시물의 수정 된 부분으로 날 도와 줄 수있는 기회가 있습니까? 미리 감사드립니다! –

+0

새로운 질문이 있습니다. 이것이 첫 번째 질문에 대한 대답이었습니다. – Boky