Неможливо ввести текстове поле Реагувати введення


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

Спасибі FaureHu - вхід thisу який момент у коді? Спроба ввійти з Searcher.handleUserInput()або SearchFacet.handleChange()нічого не робить.
Філ Гіфорд

ви можете побачити мою відповідь на подібні запитання. Ви можете знайти докладне пояснення: stackoverflow.com/questions/34713718 / ...
prudhvi seeramreddi

Відповіді:


80

Ви неправильно зарекомендували себе onchangeв програмі input. Це має бути onChangeв JSX.

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

Тема передачі valueреквізиту до <input>, а потім якось змінити значення, передане у відповідь на взаємодію користувачів за допомогою onChangeобробника, досить добре розглядається в документах .

Вони посилаються на такі входи як " Керовані компоненти" і посилаються на входи, які натомість дозволяють домену DOM самостійно обробляти значення вводу та наступні зміни від користувача як неконтрольовані компоненти .

Щоразу, коли ви встановлюєте valueопору inputна якусь змінну, у вас є контрольований компонент . Це означає , що ви повинні змінити значення змінної з допомогою деяких програмних засобів чи інакше вхід завжди матиме це значення і ніколи не зміниться, навіть якщо ви наберете - рідне поведінку на вході, щоб оновити значення на типізації, є перевизначені тут реагує.

Отже, ви правильно приймаєте цю змінну зі стану та маєте обробник, щоб оновити стан. Проблема полягала в тому, що у вас є, onchangeа не правильний onChangeобробник ніколи не викликався, і тому valueвін ніколи не оновлювався під час введення вводу. Коли ви використовуєте onChangeобробник буде викликаний, value буде оновлюватися при введенні, і ви побачите зміни.


201

Використання value={whatever}дозволить зробити це таким чином, що ви не можете вводити поле введення. Ви повинні використовувати defaultValue="Hello!".

Дивіться https://facebook.github.io/react/docs/uncont kontroli- components.html# default- values

Крім того, onchangeслід бути onChangeтаким, як вказує @davnicwil.


2
У моїй вимозі я хотів ввести поле з введенням вводу, а також його потрібно встановити на значення за замовчуванням, що прийшло зі змінної стану. атрибут defaultValue був нормальним, але є проблема з оновленням значення за замовчуванням відповідно до змін стану, чи є якийсь спосіб змусити змінити значення за замовчуванням?
семіра

1
Ви повинні опублікувати це питання як інше запитання на Stackoverflow.
Іван

1
@GeoffreyHale Я не зовсім впевнений, що ти маєш на увазі під тим, як це вводить в оману. Дивіться цей приклад, який не використовує стан: codepen.io/anon/pen/BQJZwr?editors=0010 . Або цей, який робить: codepen.io/anon/pen/JbMJMX?editors=0010
Іван

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); },робить поля знову зміненими.
Джеффрі Хейл

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

де визначити цю функцію changeText?
Jitendra Pancholi

Якщо це компонент без стану, всередині функції, і якщо це компонент класу, всередині конструктора.
Гал Грюнфельд

вам не потрібно писати this.state всередині setState. Якщо ви пишете лише textValue: event.target.value всередині setState, він також відмінно працює
Pardeep Sharma

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. див. це питання


4

Для мене наступна проста зміна спрацювала чудово

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

змінити ... value = {myPropVal} на ... defaultValue = {myPropVal}

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

Це зафіксувало це для мене. Дякую!
mikeym

Я думаю, що onChange не працює належним чином, коли використовується у Formik. Я теж намагався це зробити, але це не спрацювало. Не могли б ви тут подивитись? 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>

І це вирішило мою проблему "Не можу набрати в текстовому полі" Реагувати текст ".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.