React 입력 텍스트 필드에 입력 할 수 없습니다.


111

나는 React.js의 첫 번째 비트를 시도하고 있으며 초기에 난처 해합니다 ... 검색 양식을 <div id="search"></div>. 그러나 검색 창에 입력하는 것은 아무것도하지 않습니다.

아마도 소품과 상태를 위아래로 전달하는 것이 누락되고 있으며 이것은 일반적인 문제처럼 보입니다. 그러나 나는 어리둥절합니다. 무엇이 누락되었는지 볼 수 없습니다.

var SearchFacet = React.createClass({
  handleChange: function() {
    this.props.onUserInput(
      this.refs.searchStringInput.value
    )
  },
  render: function() {
    return (
      <div>
        Search for:
        <input
          type="text"
          value={this.props.searchString}
          ref="searchStringInput"
          onchange={this.handleChange} />
      </div>
    );
  }
});

var SearchTool = React.createClass({
  render: function() {
    return (
      <form>
        <SearchFacet 
          searchString={this.props.searchString}
          onUserInput={this.props.onUserInput}
         />
        <button>Search</button>
      </form>
    );
  }
});

var Searcher = React.createClass({
  getInitialState: function() {
    return {
      searchString: ''
    }
  },

  handleUserInput: function(searchString) {
    this.setState({
      searchString: searchString
    })
  },

  render: function() {
    return (
      <div>
        <SearchTool 
          searchString={this.state.searchString}
          onUserInput={this.handleUserInput}
        />
      </div>
    );
  }
});

ReactDOM.render(
  <Searcher />,
  document.getElementById('searcher')
);

(결국 나는 다른 유형을 갖게 될 SearchFacet*것이지만 나는 단지 이것을 작동시키기 위해 노력하고 있습니다.)


this텍스트 필드를 입력 할 때 로깅을 시도하십시오 . 더 이상 구성 요소 this가 아닐 수 있습니다 Searcher.
FaureHu 2015

감사합니다 FaureHu- this코드의 어느 지점에서 로깅 하시겠습니까? 로그인을 시도 Searcher.handleUserInput()하거나 SearchFacet.handleChange()아무것도하지 않습니다.
Phil Gyford 2015

비슷한 질문에 대한 내 대답을 볼 수 있습니다. 당신은 자세한 설명을 찾을 수 있습니다 stackoverflow.com/questions/34713718/...
prudhvi seeramreddi

답변:


80

onchange.NET에서 소품 케이스를 제대로 처리하지 않았습니다 input. 그것은 할 필요가 onChangeJSX에.

<input
  type="text"
  value={this.props.searchString}
  ref="searchStringInput"
  onchange={this.handleChange} <--[should be onChange]
/>  

value소품을 에 전달한 <input>다음 onChange핸들러를 사용하여 사용자 상호 작용에 대한 응답으로 전달 된 값을 변경하는 주제 는 문서에서 꽤 잘 고려 됩니다 .

이러한 입력을 Controlled Components 라고하며 대신 DOM이 기본적으로 입력 값과 사용자의 후속 변경 사항을 Unmanaged Components 로 처리 할 수 ​​있도록하는 입력을 참조합니다 .

valueprop input을 어떤 변수로 설정할 때마다 Controlled Component가 있습니다. 이 방법은 당신이 있어야합니다 일부 프로그램에 의해 변수의 값을 변경하거나 다른 입력이 항상 값을 보유 할 결코 변화, 심지어 입력하면됩니다 - 입력의 기본 동작을 입력에 그 값을 업데이트 할 수있다 오버라이드 (override) 여기 React로.

따라서 상태에서 해당 변수를 올바르게 가져오고 상태를 모두 올바르게 업데이트하는 핸들러가 있습니다. 문제는 처리기가 호출 되지 않았고 입력에 입력 할 때 업데이트 onchange되지 않았기 때문에 정확하지 않았기 때문 입니다. 사용 할 때 핸들러를 한다 라고하는이 되어 입력 할 때 업데이트 및 변경 사항을 참조하십시오.onChangevalueonChangevalue


201

사용 value={whatever}하면 입력 필드에 입력 할 수 없습니다. 당신은 사용해야합니다 defaultValue="Hello!".

https://facebook.github.io/react/docs/uncontrol-components.html#default-values를 참조 하십시오.

또한,이 onchange해야 onChange점 밖으로 @davnicwil한다.


2
내 요구 사항에서 입력 필드에 enable을 입력하고 상태 변수에서 가져온 기본값으로 설정해야합니다. defaultValue 속성은 괜찮 았지만 상태 변경에 따라 기본값을 업데이트하는 데 문제가 있습니다. 강제로 기본값을 변경하는 방법이 있습니까?
semira jul.

1
이 문제를 Stackoverflow에 다른 질문으로 게시해야합니다.
Ivan

1
@GeoffreyHale 오해의 소지가있는 방법이 무슨 뜻인지 잘 모르겠습니다. state : codepen.io/anon/pen/BQJZwr?editors=0010을 사용하지 않는이 예제를 참조하십시오 . 또는 다음 작업을 수행합니다. codepen.io/anon/pen/JbMJMX?editors=0010
Ivan

4
@Ivan 당신 말이 맞아요, 둘 다 불변입니다 : value={whatever}그리고 value={this.state.myvalue}. 대신 에이 설명 을 작성해야 했습니다. 사용 onChange={this.handleChange}및 이와 같은 것은 handleChange: function(e) { var newState = {}; newState[e.target.name] = e.target.value; this.setState(newState); },필드를 다시 변경 가능하게 만듭니다.
Geoffrey Hale

1
@Ivan 이건 그냥 도와 주셔서 감사합니다 defaultValue.
Code Cooker

11

이는 onChange 함수가 입력에 언급 된 적절한 값을 업데이트하지 않기 때문에 발생할 수 있습니다.

예:

<input type="text" value={this.state.textValue} onChange = {this.changeText}></input>

 changeText(event){
        this.setState(
            {textValue : event.target.value}
        );
    }

onChange 함수에서 언급 된 값 필드를 업데이트합니다.


감사합니다, 매우 도움이되었습니다. 귀하의 답변 만이 문제 해결 방법을 자세히 설명합니다.
M3RS 2011

이 changeText func를 어디에서 정의할까요?
Jitendra Pancholi

상태 비 저장 구성 요소 인 경우 함수 내부, 클래스 구성 요소 인 경우 생성자 내부.
Gal Grünfeld

setState 안에 this.state를 쓸 필요가 없습니다. 당신은 단지 textValue 작성하는 경우 : event.target.value 내부의 setState를을, 또한 완벽하게 작동
Pardeep 샤르마

4

나는 또한 같은 문제가 있고 내 경우에는 감속기를 제대로 주입했지만 여전히 필드에 입력 할 수 없습니다. 그것은 당신이 사용하는 경우 판명 immutable사용해야합니다 redux-form/immutable.

import {reducer as formReducer} from 'redux-form/immutable';
const reducer = combineReducers{

    form: formReducer
}
import {Field, reduxForm} from 'redux-form/immutable';
/* your component */

당신의 상태는 다음과 같아야합니다. state->form그렇지 않으면 라이브러리를 명시 적으로 설정해야합니다 form. 또한 state의 이름은이어야합니다 . 이 문제를 참조하십시오


4

나를 위해 다음과 같은 간단한 변경이 완벽하게 작동했습니다.

<input type="text" 
        value={props.letter} 
        onChange={event => setTxtLetter(event.target.value)} /> {/* does not work */}

변경 ... value = {myPropVal} to ... defaultValue = {myPropVal}

<input type="text" 
        defaultValue={props.letter} 
        onChange={event => setTxtLetter(event.target.value)} /> {/* Works!! */}

이것은 나를 위해 그것을 고쳤습니다. 감사합니다!
mikeym

Formik에서 사용할 때 onChange가 제대로 작동하지 않는다고 생각합니다. 나도 이것을 시도했지만 그것은 나를 위해 작동하지 않았습니다. 여기 좀 봐주 시겠어요? stackoverflow.com/questions/61689720/…
a125

0

클래스 구성 요소 컨텍스트에서 ...

changeHandler 메서드가 일반 함수 인 경우 :

handleChange(e){
    this.setState({[e.target.name]:[e.target.value]});
}

이렇게 사용할 수 있습니다 ...onChange={(e)=>this.handleChange(e)}

<input type="text" name="any" value={this.state.any} onChange={(e)=>this.handleChange(e)}></input>

changeHandler 메서드가 화살표 함수 인 경우 :

handle = (e) =>{
        this.setState({[e.target.name]:[e.target.value]});
    }

이렇게 사용할 수 있습니다 ... onChange={this.handle}

 <input type="text" name="any2" value={this.state.any2} onChange={this.handle} ></input>

그리고 이것은 "React 입력 텍스트 필드에 입력 할 수 없습니다"문제를 해결했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.