反应:避免受控组件样板

plu*_*us- 8 reactjs

所以我只是出于好奇,

任何人都找到了一种聪明的方法来处理受控组件(输入,选择......)中的双向数据绑定,而无需编写以下所有内容:

  getInitialState: function() {
    return {value: 'Hello!'};
  },
  handleChange: function(event) {
    this.setState({value: event.target.value});
  },
  render: function() {
    var value = this.state.value;
    return <input type="text" value={value} onChange={this.handleChange} />;
  } 
Run Code Online (Sandbox Code Playgroud)

nil*_*gun 5

您可能需要阅读文档中的"双向绑定助手"部分:http: //facebook.github.io/react/docs/two-way-binding-helpers.html

有这样的LinkedStateMixin:

var NoLink = React.createClass({
  getInitialState: function() {
    return {message: 'Hello!'};
  },
  handleChange: function(event) {
    this.setState({message: event.target.value});
  },
  render: function() {
    var message = this.state.message;
    return <input type="text" value={message} onChange={this.handleChange} />;
  }
});


var WithLink = React.createClass({
  mixins: [React.addons.LinkedStateMixin],
  getInitialState: function() {
    return {message: 'Hello!'};
  },
  render: function() {
    return <input type="text" valueLink={this.linkState('message')} />;
  }
});
Run Code Online (Sandbox Code Playgroud)

  • 看起来在React> = 0.13中不支持Mixin和ES6类.因此,如果你想使用它,你必须用旧的`React.createClass()方式编写你的组件.https://facebook.github.io/react/blog/2015/01/27/react-v0.13.0-beta-1.html#mixins (2认同)

Jon*_*nan 5

一个值得了解的技巧 - 因为onChange事件起泡,你可以将表单输入包装在一个容器中并注册onChange它而不是 - 这<form>是完美的.

然后你可以编写一个onChange从事件中提取数据的通用处理程序target- 你需要在字段中添加一些识别信息name,无论如何这都属于该属性.

这是一个带有示例实现Gist,以及它在运行中的实时演示 - 表单输入状态显示在表单下方.