use*_*926 15 javascript reactjs
我正在阅读关于"onChange"的文档,我很好奇如果我的论坛有多个字段,如选择框,复选框,文本区域和输入,我会怎么做?我是否只做以下事情:
getInitialState: function() {
return {textArea: 'Hello!', input: 'World', ...};
},
Run Code Online (Sandbox Code Playgroud)
处于初始状态,然后是处理该字段变化的相同概念?
Jun*_* Li 64
@FakeRainBrigand的回答非常酷.
我想以JavaScript样式共享一个(使用高阶函数),更短:
/** @jsx React.DOM */
var App = React.createClass({
getInitialState: function () {
return {
username: '',
password: ''
}
},
handleChange: function (key) {
return function (e) {
var state = {};
state[key] = e.target.value;
this.setState(state);
}.bind(this);
},
render: function(){
console.log(JSON.stringify(this.getFormData(), null, 4));
return (
<div>
<form>
Username: <input
value={this.state.username}
onChange={this.handleChange('username')} />
<br />
Password: <input type="password"
value={this.state.password}
onChange={this.handleChange('password')} />
</form>
<pre>{JSON.stringify(this.getFormData(), null, 4)}</pre>
</div>
);
}
});
React.renderComponent(<App />, document.body);
Run Code Online (Sandbox Code Playgroud)
编辑:回想起来,这个答案非常糟糕,请改用Junle Li的答案.
是的,你可以做到这一点.但是,当你获得很多表单组件时,编写所有处理程序和getInitialState调用都会非常冗长,那么mixin呢?
注意也查看react的valueLink 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>
);
}
});
Run Code Online (Sandbox Code Playgroud)
此函数采用一组字段名称,并设置初始状态,并为您提供处理函数.然后,您可以选择使用这些,或者为特殊情况创建自己的处理函数.
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("");
}
Run Code Online (Sandbox Code Playgroud)