代码之家  ›  专栏  ›  技术社区  ›  Craig

对每个领域的变化做出反应-有更好的方法吗

  •  1
  • Craig  · 技术社区  · 6 年前

    我调用一个API,获取一个有效负载并将其加载到状态。如:

    Payload : {
       id: 1,
       firstName: 'Craig',
       surname: 'Smith',
       anotherField: 'test data',
       ....
    }
    

    在我的react屏幕上,我有显示这些数据的字段。目前,对于每个字段,我都有一个onChange函数。所以:

    this.firstnameOnChange = this.firstnameOnChange.bind(this);
    

    firstnameOnChange() { ....}
    

    有没有更简单的模式来减少我需要创建的方法的数量?某种类型的通用OnChange事件,它具有名称和值,然后可以用来更新状态?

    我可以绑定到如下内容:

    myOnChange(fieldName, value) {
     // Somehow find the 'fieldName' in the state and update it's value with 'value'
    }
    

    这是一个有效的模式吗?还是有更好的办法?还是应该为每个字段使用单独的OnChange方法?

    2 回复  |  直到 6 年前
        1
  •  4
  •   Sakhi Mansoor    6 年前

    不,不建议这样写 onChange 每一个领域。您可以这样编写泛型onChange方法:

    handleChange= name => event => {
     this.setState({payload: {...this.state.payload, [name] : event.target.value}});
      }
    

     <Input onChange={this.handleChange('firstName')} placeholder="Please Enter" />
    

    附言 这里我们直接调用handleChange currying name event.target 创建一个 名称 输入中的属性。那么就不需要显式地传递输入名称。

        2
  •  1
  •   Sivcan Singh    6 年前

    因为状态是一个对象,这意味着您可以更新它的键和值。 您所要做的就是将正确的参数传递给泛型更新函数,该函数将更新状态。

    有一种方法可以做到: https://codesandbox.io/s/v382v6l483

    更新所需的值并最终将有效负载返回到 setState

    可以将此函数绑定到每个字段并保持状态更新。

    在此处阅读有关处理事件和绑定函数的更多信息: https://reactjs.org/docs/handling-events.html