我正在尝试在 React 中做一些在任何其他框架中都非常简单的事情:我想从表单中收集一堆值。

以前我用 Backbone View 做过这种事情,而且非常简单:

readFormValues: function() { 
    this.data.foo = this.$('[name="foo"]').val(); 
    this.data.bar = this.$('[name="bar"]:checked').val(); 
}); 

但在 React 中我似乎找不到一种简单的方法来做到这一点。看来我唯一的选择是......

注意:对格式表示歉意:代码块和列表不能很好地结合在一起:-(

  1. 完全绕过 React 并使用 jQuery + e.target访问表格:

    handleSubmit: function(e) {

    var $form = $(e.target).parents('form:first');

    this.data.foo = $form.find('[name="foo"]);

    },

    render: function() {

    return <form onSubmit="handleSubmit"><input name="foo"/></form>;

    }

    这很有效,而且很简单,但感觉就像我在应该只使用 React 时绕过了 React 并使用了 JQuery。

  2. 为每个表单控件提供回调:

    handleFooClick: function(e) {

    this.data.foo = event.target.value;

    },

    render: function() {

    return <form><input name="foo" onChange="handleFooChange"/></form>;

    }

    这似乎是 React/Flux 的方式,但感觉像是大量不必要的工作。在我的 Backbone 示例中,每个表单控件只需要一行,但通过这种方法,我构建的每个最后一个控件都必须有自己的 onChange 处理程序(并且我必须在渲染时将该处理程序挂接到每个元素)。

    编辑:这种方法的另一个缺点是回调 this.props 内部和this.state不会指向我的表单控件的 props/state(它将指向输入的 props/state)。这意味着我不仅必须为每个输入编写一个处理程序,并在渲染时将该回调添加到每个输入,而且还必须将我的数据对象传递给每个输入!

  3. 使用引用:

    handleSubmit: function(e) {

    this.state.data.foo = this.refs.foo.value;

    },

    render: function() {

    return <form><input ref="foo"/></form>;

    }

    这似乎是一个更明智的解决方案,因为我只需要向每个表单控件添加一个“ref”属性,然后我就可以像在 Backbone 中一样轻松地读取数据。然而,所有 React 文档都表明,以这种方式使用 refs 是错误的(所有使用 refs 的示例都涉及向控件发送信号,例如“关注此输入”,而不是从控件中读取数据)。

我觉得必须有一种“React-ive”方式来访问我的表单数据,这种方式并不是不必要的复杂,但我没有看到它,因为我对 React 的理解不够好。如果任何 React 专家能够解释我所缺少的内容,我将不胜感激。

请您参考如下方法:

首先,jQuery 是一个不必要的依赖项,而且它不是最干净的选项,所以让我们排除它。

接下来,裁判的灵 active 存在问题。看这个answer了解详情。让我们排除除最简单情况之外的所有引用。

剩下选项 #2 - Facebook 称之为 controlled components 。受控组件很棒,因为它们涵盖了所有用例(例如 keyup 验证)。虽然代码不多,但如果您不想为每个表单元素添加一个简单的更改处理程序,则可以通过使用 bind 对所有元素使用一个更改处理程序。像这样的事情:

handleChange: function(fieldName, e) { 
  console.log("field name", fieldName); 
  console.log("field value", e.target.value); 
  // Set state or use external state. 
}, 
 
render: function() { 
  var someValue = this.state.someValue; // Or a prop is using external state 
  return ( 
    <div> 
      <input  
        name="someName"  
        value={someValue}  
        onChange={this.handleChange.bind(this, "someName")} /> 
    </div> 
  ) 
} 

或者想要更简洁的方式,请参阅此 answer .


评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!