【问题标题】:Single onChange handler for webForm in ReactReact 中 webForm 的单个 onChange 处理程序
【发布时间】:2020-12-09 18:10:29
【问题描述】:
this.state = {
 data : { 
            name : {fname : 'sinni' , lname : 'jain' },
            address : { city : 'jodhpur' , state : 'rajasthan'}
            sex : 'male'
        }
  status : 'idiot'    
}


in render fuction...

render ()
{ 
     const { data , status } = this.state;

    return (
              <form>
                  <p> first name </p>
                  <input type='text' value={data.name.fname} onChange={changeHandler} />
                  <p> last name </p>
                  <input type='text' value={data.name.lname} onChange={changeHandler} />
                   
                   {//so on whole form }
                   { and sex and status are select box }

              </form>
           


   )
}
enter code here

我有这样的输入条目的整个表单...

如何创建一个 onChangeHandler 函数以便可以更新所有值。

我如何管理 [even.target.name] 以及如何使用 setState 对其进行分配,以免影响其余数据。

【问题讨论】:

  • 到目前为止你有什么尝试?
  • 您当前的changeHandler 是什么样的?我很乐意指出您尝试中的问题,甚至提出更好的方法,但如果您没有先提供尝试,人们就不太可能花时间写出好的答案。

标签: reactjs onchange setstate


【解决方案1】:

首先,您需要为每个输入命名,如果是嵌套属性,则需要为 data-parent 命名

名称必须是您要更改状态的属性的键

还有data-parent attr,这将是嵌套组件的名称

请查看下面的示例

https://codesandbox.io/s/react-input-example-forked-tu7hp?file=/src/index.js


class MyComponent extends React.Component {
  state = {
    data: {
      name: { fname: "sinni", lname: "jain" },
      address: { city: "jodhpur", state: "rajasthan" },
      sex: "male"
    }
  };

  changeHandler = (e) => {
    const parent = e.target.dataset.parent;
    const name = e.target.name;
    const newValue = e.target.value;
    this.setState((prevState) => {
      if (parent) {
        return {
          data: {
            ...prevState.data,
            [parent]: {
              ...prevState.data[parent],
              [name]: newValue
            }
          }
        };
      } else {
        return {
          data: {
            ...prevState.data,
            [name]: newValue
          }
        };
      }
    });
  };

  render() {
    const { data } = this.state;
    return (
      <div>
        <input
          type="text"
          name="fname"
          data-parent="name"
          value={this.state.data.name.fname}
          onChange={this.changeHandler}
        />
        <input
          type="text"
          name="lname"
          data-parent="name"
          value={this.state.data.name.lname}
          onChange={this.changeHandler}
        />
        <input
          type="text"
          name="city"
          data-parent="address"
          value={this.state.data.address.city}
          onChange={this.changeHandler}
        />
      </div>
    );
  }
}

【讨论】:

    【解决方案2】:
            <form>
                  <p> first name </p>
                   //when you reference state in class component, should be this.state
                  <input type='text' value={this.data.name.fname} onChange={(event) => changeHandler(event, "firstName")} />
                  <p> last name </p>
                  <input type='text' value={this.data.name.lname} onChange={(event) => changeHandler(event, "lastName")} />
                   
                   {//so on whole form }
                   { and sex and status are select box }
    
              </form>
    

    这是changeHandler:

    changeHandler = (event, firstOrLast) => {
               if(firstOrLast === "firstName") {
                 //you can access onChange event through event.target.value
                  this.setState({data{name: {...this.state.data.name, fname: event.target.value,}})}
                   }
               else {
                      this.setState(data{{name: {...this.state.data.name, lname: event.target.value}})}
                    }
            
    

    【讨论】:

    • 首先,兄弟,我在渲染中破坏了 this.state....而且我已经完成了单独的 onChange 处理程序。但是我可以将所有内容合并到一个处理程序中......对于所有......谢谢你,我想现在我可能知道如何了!
    • 很抱歉没有注意到您的解构代码。在我的回答中,我只对两个输入都使用了一个处理程序
    猜你喜欢
    • 1970-01-01
    • 2022-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    • 1970-01-01
    • 2020-04-02
    • 1970-01-01
    相关资源
    最近更新 更多