Ответ 1
Изменить: В ретроспективе этот ответ довольно плох, вместо этого используйте Junle Li.
Да, вы можете сделать именно это. Однако, когда вы получаете много компонентов формы, может быть довольно многословно писать все обработчики и вызовы getInitialState, так как насчет mixin?
Обратите внимание, что также посмотрите на значение реакцииLink mixin
Посмотрим, как будет выглядеть наше представление с примером знака в форме. Вы можете вызвать this.getFormData()
, чтобы получить объект только с вашим статусом формы, что также позволяет сохранять другие значения в состоянии.
// create a mixin for our form
var formMixin = makeFormMixin([
"username",
"password"
]);
var App = React.createClass({
mixins: [formMixin],
render: function(){
return (
<div>
<form>
Username: <input
value={this.state.username}
onChange={this.handleUsernameChange} />
Password: <input type="password"
value={this.state.password}
onChange={this.handlePasswordChange} />
</form>
</div>
);
}
});
Эта функция принимает массив имен полей и устанавливает начальное состояние и предоставляет для вас функции обработчика. Затем вы можете использовать их или создавать собственные функции обработчика для особых случаев.
function makeFormMixin(fields){
var mixin = {
getInitialState: function(){
var state = {};
fields.forEach(function(field){
state[field] = this.props[field] || "";
}, this);
return state;
},
getFormData: function(){
var data = {};
fields.forEach(function(field){
data[field] = this.state[field];
}, this);
console.log(data);
return data;
}
};
fields.forEach(function(field){
var method = camelJoin(["handle", field, "change"]);
mixin[method] = function(event){
var update = {};
update[field] = event.target.value;
this.setState(update);
}
});
return mixin;
}
// helper function ["Makes", "things", "camel", "case"] => "makesThingsCamelCase"
function camelJoin(parts){
return parts.map(function(part, i){
if (i === 0) {
return part[0].toLowerCase() + part.slice(1);
}
else {
return part[0].toUpperCase() + part.slice(1);
}
}).join("");
}