2015-03-26 7 views
112

EDIT: это дубликат, см. hereReactjs setState() с динамическим именем ключа?

Я не могу найти примеры использования динамического имени ключа при настройке состояния. Это то, что я хочу сделать:

inputChangeHandler : function (event) { 
    this.setState({ event.target.id : event.target.value }); 
}, 

где event.target.id используется в качестве государственного ключа в обновлении. Разве это невозможно в реактиве?

+2

Это копия любого вопроса, касающегося динамических ключей объектов. Не обязательно реагировать –

+5

var newstate = {}; newstate [event.target.id] = event.target.id; this.setState (NewState); –

+0

Спасибо, у меня не было хорошей справки об использовании объектов вообще. – trad

ответ

157

Благодаря намек @ Кори, я использовал это:

inputChangeHandler : function (event) { 
    var stateObject = function() { 
     returnObj = {}; 
     returnObj[this.target.id] = this.target.value; 
     return returnObj; 
    }.bind(event)(); 

    this.setState(stateObject);  
}, 

При использовании ES6 или Babel transpiler превратить ваш код JSX, вы можете сделать это с computed property names тоже:

inputChangeHandler : function (event) { 
    this.setState({ [event.target.id]: event.target.value }); 
    // alternatively using template strings for strings 
    // this.setState({ [`key${event.target.id}`]: event.target.value }); 
} 
+13

Существует также новый синтаксис для этого, если вы используете bablejs для создания своего кода. Вы можете использовать 'вычисленные имена свойств' –

+0

Второй подход вызывает синтаксическую ошибку в браузерах на WIndows (IE, Chrome). Кто-нибудь заметил? – benjaminz

+0

Как получить информацию? –

31

Как Я достиг этого ...

inputChangeHandler: function(event) { 
    var key = event.target.id 
    var val = event.target.value 
    var obj = {} 
    obj[key] = val 
    this.setState(obj) 
}, 
+0

Простой и удивительный, спасибо – AmerllicA

+0

Я сделал аналогичный путь, но проблема заключалась в том, что он по-прежнему не отображал компонент, и я запустил столб для публикации (включая это: D), и где-то нашел это: 'this.forceUpdate();' который не должно было быть случая с последним Реактивом. Давайте посмотрим, что проблема позже! – xploreraj

-2

Может использовать синтаксис распространения, что-то li ка это:

inputChangeHandler : function (event) { 
    this.setState({ 
     ...this.state, 
     [event.target.id]: event.target.value 
    }); 
}, 
+3

Реагирует на слияние объекта для вас, это плохая практика. – Rohmer

+1

setState уже объединяет состояние с новыми реквизитами –

+1

в основном, если у вас есть внутренний объект, и вы хотите изменить одно свойство на этом внутреннем объекте, вы делаете это так: this.setState ({selectedItems: {... selectedItems, [item.id]: true}}) –

38

Если вам необходимо работать с несколькими контролируемых элементами ввода, вы можете добавить имя атрибут для каждого элемента, и пусть функция обработчика выбрать, что делать на основе стоимости event.target.name.

Например:

inputChangeHandler(event) { 
 
    this.setState({ [event.target.name]: event.target.value }); 
 
}

+0

Что означают скобки вокруг [event.target.name]? Зачем они нужны? – user798719

+0

По сравнению с обычным подходом к названию каждого элемента отдельно, например this.setState ({имя_пользователя: e.target.value}); Это будет обрабатывать несколько элементов формы как массив и не нужно устанавливать каждый отдельный элемент –

 Смежные вопросы

  • Нет связанных вопросов^_^