简体   繁体   English

处理组件中动态输入字段的更改

[英]Handling change for dynamic input field in components

The state of array values is not changing i have tried many times but still not succeeded is there a way that i missed somehow here is the attached code highlighting the problem.数组值的 state 没有改变我已经尝试了很多次但仍然没有成功是否有一种方法我错过了这里是突出显示问题的附加代码。 If anyone can help it would be much appreciated.如果有人可以提供帮助,将不胜感激。

Class component handling form stepper Class 组件处理表单步进器

 constructor(props) {
    super(props);
    this.state = {
      step: 1,
      propertyID:0,
      responseMessage:"",    
      loading:false,
      name:"",
      address: "",
      county:"",
      city: "",
      zipcode: "",
      type: "",
      specifictype: "",
      formValues:[{beds:"",rent:"",numUnits:0,squarefeet:""}]
    };
  }
handleFormChange(i, e) {
    let formValues = this.state.formValues;    
    console.log(formValues);
    formValues[i][e.target.name] = e.target.value;
    this.setState({ formValues });
  }
  render() {
    const { step } = this.state;
    const {
      address,
      name,
      specifictype,
      city,
      county,
      zipcode,
      type,
      formValues,
      responseMessage
    } = this.state;
    const values = {
      address,
      name,
      specifictype,
      city,
      zipcode,
      type,
      county,
      formValues,
      responseMessage
    } ;

    switch (step) {
      
      
      case 3:
        return(
            <PropertyType
                values={values}
                add={this.addFormFields.bind(this)}
                remove = {this.removeFormFields.bind(this)}
                handleChange={this.handleFormChange}
                prevStep={this.prevStep}
                nextStep={this.getandSend}

            />
        )
     
    }
  }

then here is the code of the component that handles the dynamic input fields.I had to reduce the code other parts are working fine do not worry about values,add,remove,prevStep and next step those are working just fine the problem is how i handle the change然后这是处理动态输入字段的组件的代码。我不得不减少其他部分工作正常的代码不要担心值,添加,删除,prevStep和下一步这些工作正常问题是我如何处理变化

function PropertyType({values,add,remove,handleChange,prevStep,nextStep}) {

return(
<>
 <form action="">
                            {values.formValues.slice(0,5).map((element, index) => (
                            <div className="w-full md:w-9/12 flex mx-auto">
                                <div className="mb-6 mr-3">
                                    <label
                                        className="block mb-2 text-coolGray-800"
                                        htmlFor=""
                                    >
                                        Beds
                                    </label>
                                    <select defaultValue={element.beds} onChange={e => handleChange(index, e)} className="block w-full p-3 leading-5 text-coolGray-900 border border-coolGray-200 rounded-lg shadow-md placeholder-coolGray-400 focus:outline-none focus:ring-2 focus:ring-color-main focus:ring-opacity-50 bg-white" aria-label="Default select example">
                                        <option selected>Select bedrooms</option>
                                        <option value="0">Studio</option>
                                        <option value="1">One</option>
                                        <option value="2">Two</option>
                                        <option value="3">Three</option>
                                        <option value="4+">More than 4</option>
                                    </select>
                                </div>
                                <div className="mb-2 mr-3">
                                    <label
                                        className="block mb-2 text-coolGray-800 font-medium"
                                        htmlFor=""
                                    >
                                        Number of units
                                    </label>
                                    <input
                                        defaultValue={element.numUnits}
                                        onChange={e => handleChange(index, e)}
                                        className="appearance-none block w-full p-3 leading-5 text-coolGray-900 border border-coolGray-200 rounded-lg shadow-md placeholder-coolGray-400 focus:outline-none focus:ring-2 focus:ring-color-main focus:ring-opacity-50"
                                        type="number"
                                        placeholder="10"
                                    />
                                </div>
                                <div className="mb-2 mr-3">
                                    <label
                                        className="appearance-none block mb-2 text-coolGray-800 font-medium"
                                        htmlFor=""
                                    >
                                        Squarefeet
                                    </label>
                                    <input
                                        defaultValue={element.squarefeet}
                                        onChange={e => handleChange(index, e)}
                                        className="appearance-none block w-full p-3 leading-5 text-coolGray-900 border border-coolGray-200 rounded-lg shadow-md placeholder-coolGray-400 focus:outline-none focus:ring-2 focus:ring-color-main focus:ring-opacity-50"
                                        type="number"
                                        placeholder="2000"
                                    />
                                </div>
                                <div className="mb-2 mr-3">
                                    <label
                                        className="block mb-2 text-coolGray-800 font-medium"
                                        htmlFor=""
                                    >
                                        Rent
                                    </label>
                                    <input
                                        defaultValue={element.rent}
                                        onChange={e => handleChange(index, e)}
                                        className="appearance-none block w-full p-3 leading-5 text-coolGray-900 border border-coolGray-200 rounded-lg shadow-md placeholder-coolGray-400 focus:outline-none focus:ring-2 focus:ring-color-main focus:ring-opacity-50"
                                        type="number"
                                        placeholder="30,000"
                                    />
                                </div>
                                {
                                    index ?<div className="mb-2 mr-3 mt-8">
                                            <button  className=" inline-block py-3 px-7 mb-4 w-full text-base text-white font-medium text-center leading-6 bg-red-500/50 rounded-md shadow-sm
                                            " onClick={remove}>Remove</button> </div>

                                        : null
                                }

                            </div>
                            ))}

</>

)

}

You need to update the reference of the formValues array with spread operator .您需要使用spread operator更新formValues数组的引用。

handleFormChange(i, e) {
    let formValues = this.state.formValues;    
    console.log(formValues);
    formValues[i][e.target.name] = e.target.value;
    this.setState({ formValues: [...formValues ]});
}

you have to make a copy of reference and then update as below:您必须复制参考,然后更新如下:

handleFormChange(i, e) {
        const formValues = [...this.state.formValues]; 
        const res = formValues.map((val,idx)=>{
           if(idx == i){
             return ({...val, [e.target.name]: e.target.value})
           }
           return val
        }) 
        this.setState({ ...this.state, formValues: res});
    }

finally found the answer for anyone who might need it终于为可能需要的人找到了答案

class Apps extends React.Component {
  constructor(props) {
    super(props)
    this.state = { 
       formValues: [{ name: "", email : "" }]
     };
    
  }
  handleChange(i, e) {
    let formValues = this.state.formValues;
    formValues[i][e.target.name] = e.target.value;
    this.setState({ formValues });
  }
  render() {
    const {formValues} = this.state;
    return (
        <PropertyType values={formValues}  handleChange={this.handleChange.bind(this)} />
    );
  }
}

Here is the propertytype component这是属性类型组件

{values.map((element, index) => (
            <div className="form-inline" key={index}>
              <label>Name</label>
              <input type="text" name="name" value={element.name || ""} onChange={e => handleChange(index, e)} />
              <label>Email</label>
              <input type="text" name="email" value={element.email || ""} onChange={e => handleChange(index, e)} />
              {
                index ? 
                  <button type="button"  className="button remove" onClick={() => remove(index)}>Remove</button> 
                : null
              }
            </div>
          ))}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM