[javascript] 반응-제어되지 않은 입력 변경

제어 된 입력이 하나 있다고 생각되는 형식의 간단한 반응 구성 요소가 있습니다.

import React from 'react';

export default class MyForm extends React.Component {
    constructor(props) {
        super(props);
        this.state = {}
    }

    render() {
        return (
            <form className="add-support-staff-form">
                <input name="name" type="text" value={this.state.name} onChange={this.onFieldChange('name').bind(this)}/>
            </form>
        )
    }

    onFieldChange(fieldName) {
        return function (event) {
            this.setState({[fieldName]: event.target.value});
        }
    }
}

export default MyForm;

내 응용 프로그램을 실행하면 다음 경고가 나타납니다.

경고 : MyForm이 제어 할 텍스트 유형의 제어되지 않은 입력을 변경하고 있습니다. 입력 요소는 제어되지 않은 상태에서 제어 된 상태로 또는 그 반대로 전환해서는 안됩니다. 구성 요소의 수명 동안 제어 또는 제어되지 않은 입력 요소 사용 여부 결정

나는 가치가 있기 때문에 입력이 통제된다고 생각합니다. 내가 뭘 잘못하고 있는지 궁금해?

React 15.1.0을 사용하고 있습니다



답변

나는 가치가 있기 때문에 입력이 통제된다고 생각합니다.

입력을 제어하려면 해당 값이 상태 변수의 값과 일치해야합니다.

this.state.name처음에 설정되지 않았기 때문에 해당 조건이 예제에서 처음 충족 되지 않았습니다. 따라서 입력은 처음에는 제어되지 않습니다. 한 번 onChange핸들러가 처음으로 트리거, this.state.name설정됩니다. 이때 상기 조건이 만족되고 입력이 제어 된 것으로 간주된다. 제어되지 않은 상태에서 제어 된 상태로 전환하면 위에서 본 오류가 발생합니다.

this.state.name생성자에서 초기화 하여 :

예 :

this.state = { name: '' };

입력이 처음부터 제어되어 문제가 해결됩니다. 자세한 예는 반응 제어 구성 요소 를 참조하십시오 .

이 오류와 관련이없는 경우 기본 내보내기는 하나만 있어야합니다. 위의 코드에는 두 가지가 있습니다.


답변

먼저 구성 요소를 렌더링 할 때, this.state.name이 평가되도록 설정되어 있지 않은 undefined또는 null, 당신은 통과 끝날 value={undefined}또는 value={null}당신을에 input.

필드가 제어되는 경우 ReactDOM 여부를 확인하는 경우 그것을 확인 있는지 확인하기 위해value != null (그것의주의 !=,하지를 !==)하고 있기 때문에 undefined == null자바 스크립트에서, 그것은 통제되지 않은하다고 결정한다.

따라서 onFieldChange()호출 될 때 this.state.name문자열 값으로 설정되면 입력이 제어되지 않는 상태에서 제어되는 상태가됩니다.

this.state = {name: ''}생성자에서 수행하는 경우 '' != null, 입력은 항상 값을 가지므로 해당 메시지는 사라집니다.


답변

다른 접근 방식은 다음과 같이 입력 내부의 기본값을 설정하는 것입니다.

 <input name="name" type="text" value={this.state.name || ''} onChange={this.onFieldChange('name').bind(this)}/>


답변

나는 다른 사람들이 이미 이것에 대답했다는 것을 안다. 그러나 다른 사람들이 비슷한 문제를 겪을 수 있도록 도와주는 매우 중요한 요소는 다음과 같습니다.

onChange입력 필드에 핸들러를 추가 해야합니다 (예 : textField, 확인란, 라디오 등). onChange핸들러를 통해 항상 활동을 처리하십시오 .

예:

<input ... onChange={ this.myChangeHandler} ... />

확인란 으로 작업 할 때로checked 상태 를 처리해야 할 수도 있습니다 !!.

예:

<input type="checkbox" checked={!!this.state.someValue} onChange={.....} >

참조 : https://github.com/facebook/react/issues/6779#issuecomment-326314716


답변

이 문제를 해결하는 간단한 해결책은 기본적으로 빈 값을 설정하는 것입니다.

<input name='myInput' value={this.state.myInput || ''} onChange={this.handleChange} />


답변

생성자에서 필드 값을 “”(빈 문자열)로 설정하면 발생할 수있는 단점은 필드가 선택적 필드이고 편집되지 않은 상태로 남아있는 것입니다. 양식을 게시하기 전에 일부 마사지를 수행하지 않으면 필드는 데이터 저장소에 NULL 대신 빈 문자열로 유지됩니다.

이 대안은 빈 문자열을 피합니다.

constructor(props) {
    super(props);
    this.state = {
        name: null
    }
}

...

<input name="name" type="text" value={this.state.name || ''}/>


답변

onChange={this.onFieldChange('name').bind(this)}입력에서 사용할 때는 상태 빈 문자열을 속성 필드 값으로 선언해야합니다.

잘못된 방법 :

this.state ={
       fields: {},
       errors: {},
       disabled : false
    }

올바른 방법 :

this.state ={
       fields: {
         name:'',
         email: '',
         message: ''
       },
       errors: {},
       disabled : false
    }