在没有状态的情况下使用 react 提交表单

IT技术 javascript reactjs
2021-05-15 04:11:47

我有这个简单的场景。用户单击编辑按钮,他会转到一个页面,每个字段都填写了表单。他改变了一些东西,然后点击保存,很简单。在 jquery 中,我们只是绑定并从 DOM 中获取值,在 angularjs 中 2 方式绑定的工作原理相同,但是在 react 中呢?

我经常看到人们通过将输入绑定到 onChange 来获取表单值,但在编辑案例中,用户可能不会触及每个字段。我认为不需要状态。我需要绑定我的数据

var item = {
    "name":"James",
    "dates": {
    "contract": [
          {"id":1,"name":"1 month","value":false},
          {"id":2,"name":"2 months","value":true}
        ]
    }}

https://jsfiddle.net/p1pztpcw/

我还有一个问题。我收到警告Use the 'defaultValue' or 'value' props on <select> instead of setting 'selected' on <option>.

3个回答

对于你的问题<select>作出react能够读取propsvalue<select>因此,不推荐selectedonoption与 React 一起使用。

对于关于创建状态与否的问题,您可以通过在提交表单时读取每个输入值来避免它。每个输入都可以使用Reactref属性访问但是您必须绑定每个输入:

<input type="text" ref={(input) => { this.textInput = input; }} />

最好的解决方案是使用 on change 并调用单个函数。如果您想在该函数中使用,您可以使用 switch 语句。

关于警告:使用

<select value={obj.id}>

而不是在

<option selected="true">

使用refs您可以访问输入字段,并且对于选择,您必须在更改时进行处理。您不需要处理所有事情,即使您使用的是 Redux,您也无法修改状态,因此您无法处理事件并调用this.setState(...);

基本上,您可以直接使用访问该值,this.refs.refName.value或者您可以使用一个函数来设置这样的值ref={(input) => { this.input = input; }},然后通过this.input.

你可以在这里阅读完整的文档

对于默认值 on select,根据ReactJS 文档使用value={this.state.value}是可以的。如果您收到警告,则可能是由其他原因引起的。

如果您使用的是像 Redux 这样的框架,您不能(或不应该)修改状态,那么您应该分派一个动作handleChange而不是设置状态。

但是如果你不想使用handlres两者refs,那么你应该考虑从 ReactJS 转移。我更喜欢使用 refs,因为它感觉更干净。

这里有一个工作示例:

var Hello = React.createClass({
  handleSave: function(){
    alert('name: ' + this.refs.input.value)
    alert('selectValue: ' + this.state.selectValue)
  },
  render: function() {
    var item = {
    "name":"James",
    "dates": {
    "contract": [
          {"id":1,"name":"1 month","value":false},
          {"id":2,"name":"2 months","value":true}
        ]
    }}

    return (
      <div>
        <input type="text" value={item.name} ref={'input'}/>

        <select className="form-control" onChange={this.handleChange.bind(this)} >
          {item.dates.contract.map(obj => 
            <option value={obj.id}  selected={obj.value}>{obj.name}</option>
          )}
        </select>
    <button onClick={this.handleSave.bind(this)}>Save form</button></div>)
  },
  handleChange:function(e){
    this.setState({selectValue: e.target.value});
  }
});

ReactDOM.render(
  <Hello name="World" />,
  document.getElementById('container')
);

查询

ReactJS 团队不推荐使用 JQuery,因为 JQuery 完全剥夺了 ReactJS 对 DOM 的控制,这可能会导致不良行为。假设我们选择了 ReactJS 来为我们控制 DOM。实际上根本不需要使用 JQuery。