编辑:回顾起来,这个答案很糟糕,请使用 Junle Li 的答案。
是的,您可以完全这样做。然而,当您有许多表单组件时,编写所有处理程序和getInitialState调用可能会非常冗长,那么混合使用怎么样呢?
jsbin
还要查找一下react的valueLink mixin
让我们来看一个示例登录表单的视图。您可以调用this.getFormData()
来获取仅包含表单状态的对象,从而允许您在状态中存储其他值。
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;
}
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("");
}
getFormData()
的定义在哪里? - tdcgetFormData
视为this.state
。 - Junle Li