2017-01-25 1 views
1

사용자가 여러 텍스트 필드를 지정한 다음이 양의 필드를 동적으로 렌더링 할 수있는 앱을 만들고 있습니다. 상태를 설정하여 각 필드에 대해 고유하도록하는 데 문제가 있습니다. 다음 코드 세그먼트는 다음과 같습니다 현재React의 텍스트 입력을 반복합니다.

 var fieldsArray = []; 

     for(var i = 0; i <= this.props.numToShow; i ++){ 
     fieldsArray.push(
      <div> 
       <label> 
        <div className="label">{i}</div> 
        <input type='text' value={this.state.value} name={this.state.value} onChange={this.handleChange} /> 
       </label> 
      </div> 
      ); 
     } 

    return (
     <div className = 'inputs'> 
     {fieldsArray} 
     </div> 
    ); 

, 내가 필드 중 하나는, 다른 모든 필드는 그 고유의 필드 상태로 업데이트 변경할 때.

handleChange: function(e){ 
     this.setState({ 
      value: e.target.value, 
     }); 
    } 

이 배열로 상태를 초기화하는 방법은 입력의 트랙을 유지할 수있다 : 여기 상태를 설정 handleChange 기능은 무엇입니까? 아니면 이것을 할 수있는 더 좋은 방법이 있습니까?

답변

2

상태 배열을 유지하면 정상적으로 작동합니다. 업데이트 할 항목을 알 수 있도록 입력 색인을 전달하는지 확인해야합니다. bind은 다음과 관련이 있습니다.

class YourComponent extends React.Component { 
    constructor(props) { 
    super(props); 
    this.state = { values: [] }; 
    } 

    handleChange(i, e) { 
    this.setState({ 
     values: { ...this.state.values, [i]: e.target.value } 
    }); 
    } 

    render() { 
    var fieldsArray = []; 

    for (var i = 0; i <= this.props.numToShow; i++) { 
     fieldsArray.push(
     <div> 
      <label> 
       <div className="label">{i}</div> 
       <input 
        type='text' 
        value={this.state.values[i]} 
        name={this.state.values[i]} 
        onChange={this.handleChange.bind(this, i)} /> 
      </label> 
     </div> 
    ); 
    } 

    return (
     <div className = 'inputs'> 
     {fieldsArray} 
     </div> 
    ); 
    } 
} 
+0

확산 연산자가있는 행에서 프로그램이 실패합니다. 이 라인이 무엇을하는지 더 이해하려고 노력 중입니다. this.state.values는 현재 상태 값을 모두 유지하고 [i] : e.target.value는 현재 입력 값을 대상 값으로 설정합니다. 대신 값 [i]이 아니어야합니다. 내 스택이 지원하지 않는지 확실하지 않지만 추가 연구를 통해 문제가되지 않아야합니다. – user3745115

+1

아마 당신은 Babel로 설정된 스프레드 연산자가 없을 것입니다. 내가 사용하고있는 이유는 배열 값이 새로운 객체이고 인덱스 만 변경 되었기 때문입니다. 대신 이것을 시도 할 수 있습니다 :'var newValues ​​= this.state.values.slice(); newValues ​​[i] = e.target.value; this.setState ({values ​​: newValues}); ' – Jacob

+0

그 트릭을 했어. 고맙습니다! – user3745115

관련 문제