React和Multiple表单字段

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)

  • `getFormData()`的定义在哪里? (2认同)

Bri*_*and 9

编辑:回想起来,这个答案非常糟糕,请改用Junle Li的答案.


是的,你可以做到这一点.但是,当你获得很多表单组件时,编写所有处理程序和getInitialState调用都会非常冗长,那么mixin呢?

jsbin

注意也查看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)

  • 我真的不得不约束自己不要赞成这个答案。你是对的 - 李俊乐的回答要好得多(因此我最终选择不赞成你的)。但是你自己指出这一点确实值得称赞。我希望有一种方法可以代表谦逊和诚实——这两者都是令人惊叹的性格品质,但往往没有得到足够的认可。这个评论是我不恰当的表达方式:Kudos。并感谢您的贡献! (2认同)