首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >React.js:使用一个onChange处理程序标识不同的输入

React.js:使用一个onChange处理程序标识不同的输入
EN

Stack Overflow用户
提问于 2014-01-10 04:02:42
回答 10查看 126.5K关注 0票数 154

好奇什么是解决这个问题的正确方法:

代码语言:javascript
复制
var Hello = React.createClass({
getInitialState: function() {
    return {total: 0, input1:0, input2:0};
},
render: function() {
    return (
        <div>{this.state.total}<br/>
            <input type="text" value={this.state.input1} onChange={this.handleChange} />
            <input type="text" value={this.state.input2} onChange={this.handleChange} />
        </div>
    );
},
handleChange: function(e){
    this.setState({ ??? : e.target.value});
    t = this.state.input1 + this.state.input2;
    this.setState({total: t});
}
});

React.renderComponent(<Hello />, document.getElementById('content'));

显然,您可以创建单独的handleChange函数来处理每个不同的输入,但这并不是很好。类似地,您可以只为单个输入创建一个组件,但我想看看是否有这样做的方法。

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2014-01-10 05:43:55

我建议在input元素上使用标准的超文本标记语言属性,比如name来识别输入。此外,您不需要将"total“作为一个单独的值保存在state中,因为它可以通过在state中添加其他值来组合:

代码语言:javascript
复制
var Hello = React.createClass({
    getInitialState: function() {
        return {input1: 0, input2: 0};
    },
    render: function() {
        const total = this.state.input1 + this.state.input2;

        return (
            <div>{total}<br/>
                <input type="text" value={this.state.input1} name="input1" onChange={this.handleChange} />
                <input type="text" value={this.state.input2} name="input2" onChange={this.handleChange} />
            </div>
        );
    },
    handleChange: function(e) {
        this.setState({[e.target.name]: e.target.value});
    }
});

React.renderComponent(<Hello />, document.getElementById('content'));
票数 173
EN

Stack Overflow用户

发布于 2014-03-03 00:47:55

您可以使用.bind方法预先构建handleChange方法的参数。它应该是这样的:

代码语言:javascript
复制
  var Hello = React.createClass({
    getInitialState: function() {
        return {input1:0, 
                input2:0};
    },
    render: function() {
      var total = this.state.input1 + this.state.input2;
      return (
        <div>{total}<br/>
          <input type="text" value={this.state.input1} 
                             onChange={this.handleChange.bind(this, 'input1')} />
          <input type="text" value={this.state.input2} 
                             onChange={this.handleChange.bind(this, 'input2')} />
        </div>
      );
    },
    handleChange: function (name, e) {
      var change = {};
      change[name] = e.target.value;
      this.setState(change);
    }
  });

  React.renderComponent(<Hello />, document.getElementById('content'));

(我还让total在渲染时计算,因为这是推荐的做法。)

票数 107
EN

Stack Overflow用户

发布于 2016-03-15 04:33:19

onChange事件气泡...所以你可以这样做:

代码语言:javascript
复制
// A sample form
render () {
  <form onChange={setField}>
    <input name="input1" />
    <input name="input2" />
  </form>
}

您的setField方法可能如下所示(假设您使用的是ES2015或更高版本:

代码语言:javascript
复制
setField (e) {
  this.setState({[e.target.name]: e.target.value})
}

我在几个应用程序中使用了类似的东西,非常方便。

票数 41
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21029999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档