EDIT: это дубликат, см. здесь
Я не могу найти примеры использования имени динамического ключа при настройке состояния. Это то, что я хочу сделать:
inputChangeHandler : function (event) {
this.setState( { event.target.id : event.target.value } );
},
где event.target.id используется в качестве ключа состояния для обновления. Разве это невозможно в реактиве?
Благодаря подсказке @Cory я использовал это:
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, вы можете выполнить это с помощью вычисленные имена свойств:
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 });
}
computed property names
Когда вам нужно обрабатывать несколько управляемых элементов ввода, вы можете добавить атрибут имени к каждому элементу и позволить функции обработчика выбирать, что делать, исходя из значения event.target.name.
Например:
inputChangeHandler(event) {
this.setState({ [event.target.name]: event.target.value });
}
Как я это сделал...
inputChangeHandler: function(event) {
var key = event.target.id
var val = event.target.value
var obj = {}
obj[key] = val
this.setState(obj)
},
this.forceUpdate();
что не должно было случиться с последним React. Давайте посмотрим, в чем проблема позже!
Просто хотел добавить, что вы можете также де-структурировать, чтобы реорганизовать код и сделать его более аккуратным.
inputChangeHandler: function ({ target: { id, value }) {
this.setState({ [id]: value });
},
В цикле с .map
работать так:
{
dataForm.map(({ id, placeholder, type }) => {
return <Input
value={this.state.type}
onChangeText={(text) => this.setState({ [type]: text })}
placeholder={placeholder}
key={id} />
})
}
Обратите внимание на []
в параметре type
. Надеюсь это поможет :)
inputChangeHandler = (event) => {
const stateObject = {};
stateObject[event.target.id] = event.target.value;
this.setState(stateObject);
};
Можно использовать синтаксис распространения, что-то вроде этого:
inputChangeHandler : function (event) {
this.setState( {
...this.state,
[event.target.id]: event.target.value
} );
},