Dark_Knight
@Dark_Knight
Game Dev

Как правильно вешать onChange на input в React.js?

Здравствуйте.
Есть две кнопки. В зависимости от того, на какую кнопку я нажал, рендерятся текстовые поля с данными.
var Data = [1, 2, 3];

var Test = ['Vasya', 'Kate', 'TEst'];

var Main = React.createClass({

    getInitialState: function () {
        return {
            inputs: null
        }
    },

    _getData: function () {
        this.setState({
            inputs: Data
        });
    },

    _getTest: function () {
        this.setState({
            inputs: Test
        });
    },

    createBtnData: function () {
        return <button onClick={this._getData}>Get Data</button>;
    },

    createBtnTest: function () {
        return <button onClick={this._getTest}>Get Test</button>;
    },

    _changeValue: function (e) {
        var val = e.target.value;

        this.setState({
            inputs: val
        });
    },

    createInput: function () {

        if (this.state.inputs) {
            return this.state.inputs.map(function (item, i) {
                return <input key={i} value={item} onChange={this._changeValue} />
            }.bind(this));
        }
    },

    render: function() {
        return <div>
                   {this.createBtnData()}
                   {this.createBtnTest()}
                   {this.createInput()}
               </div>;
    }
});

Проблема в том, что когда я кликаю на одно из полей и пытаюсь ввести текст, то вызывается следующая ошибка:
TypeError: this.state.inputs.map is not a function
Я тако понимаю, что проблема в том, что метод map снова пытается вызваться для данных, которые я ввожу, и так как это уже не массив, а строка, то отсюда и ошибка.
Вопрос: как в данном случае мне правильно повесить обработчик onChange на input, чтоб код работал корректно, то есть: отрендерил нужные данные, внес в них изменения, если нужно отрендерил другие.
Спасибо за помощь.
  • Вопрос задан
  • 5230 просмотров
Решения вопроса 1
VovanR
@VovanR
Фронт-энд Вэб-разработчик
Например так jsfiddle.net/VovanR/0btxjm5c
Заменяем значение элемента по индексу и обновляем стэйт.
Возможно есть другой способ.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@mass3ff3ct
У вас ошибка в коде. Изначально переменная состояния inputs - это массив. Но в обработчике события onChange вы присваиваете inputs строку. У строки нет метода map, который используется в createInput
Ответ написан
Комментировать
maxfarseer
@maxfarseer
https://maxpfrontend.ru, обучаю реакту и компании
Описал работу с инпутом как с контроллируемым и неконтроллируемым компонентом здесь
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы