【问题标题】:Updating the checkbox value based on the backend reponse using react使用 react 根据后端响应更新复选框值
【发布时间】:2021-10-27 14:25:36
【问题描述】:

我正在尝试执行编辑功能,我将从后端获取数据。因此,如果家属的值为“1,2”,则应选中复选框。如果需要,我应该能够取消选中该复选框并再次发送该值。在下面的一个中,当我们单击第二行的添加时,我正在检查复选框的值是否为 2(行:79)并且它显示为已选中。问题是当我无法取消选择它并再次发送时。

https://codesandbox.io/s/naughty-rhodes-i2sn9?file=/src/App.js

【问题讨论】:

    标签: javascript reactjs checkbox


    【解决方案1】:

    我稍微修改了你的代码, dependents state 无法处理所有表单值的依赖,所以我在表单值对象中添加了一个依赖对象, 我已经测试过它并且它正在工作, 只修改了复选框的代码和逻辑,所有其他代码都与您的相似

    https://codesandbox.io/s/react-fiddle-forked-ubcz4

    试试这个

    import React, { useState } from "react";
    
    const App = () => {
      const [formValues, setFormValues] = useState([
        { orderno: 1, inputValue1: "", inputValue2: "", dependentParams: [] }
      ]);
      const [dependents, setDependents] = useState("");
    
      // control order number in a state to make sure
      // that it does not get messed when you remove
      // an indice from formValues
      // !! default was 0. so set it to 1
      const [orderNumber, setOrderNumber] = useState(1);
    
      const addFormFields = () => {
        let dependentString = [];
        formValues.map((d, i) => {
          dependentString.push(i + 1);
        });
        setFormValues((prevState) => [
          ...prevState,
          {
            orderno: orderNumber + 1,
            inputValue1: "",
            inputValue2: "",
            dependentParams: dependentString.length ? dependentString : []
          }
        ]);
        // increment order number
        setOrderNumber((prev) => prev + 1);
      };
    
      const removeFormFields = (i) => {
        let newFormValues = [...formValues];
        newFormValues.splice(i, 1);
    
        setFormValues(newFormValues);
    
        // decrement order number
        setOrderNumber((prev) => prev - 1);
      };
    
      const onChangeFieldValue = (index, key, value) => {
        setFormValues((prevState) => {
          let copyState = [...prevState];
          copyState[index][key] = value;
          return copyState;
        });
      };
      const onchangeCheckbox = (e, orderNo, index) => {
        setFormValues((prevState) => {
          let copyState = [...prevState];
          let dependentParams = [...copyState[orderNo].dependentParams];
          console.log(index, dependentParams);
          if (dependentParams.indexOf(index) !== -1) {
            dependentParams.splice(dependentParams.indexOf(index), 1);
          } else {
            dependentParams.push(index);
          }
          copyState[orderNo].dependentParams = dependentParams;
          return copyState;
        });
      };
    
      const saveFields = (e) => {
        const queryparam = {
          data: "xxx",
          DbData: "xxx",
          SQlData: "xxx", // only checked ones
          overallData: { formValues : formValues.map(d => ({...d, dependentParams:d.dependentParams.join(',')})) }
        };
        console.log(queryparam, "hhhhhhh");
      };
    
      const rows = (ele, orderno) => {
        let rowNos = [];
        for (let i = 0; i < orderno; i++) {
          rowNos.push(
            <>
              <input
                type="checkbox"
                value={orderno - i}
                id={orderno - i}
                checked={ele.dependentParams.indexOf(orderno - i) !== -1}
                onChange={(e) => {
                  onchangeCheckbox(e, orderno, orderno - i);
                }}
              />
              Params {orderno - i}
            </>
          );
        }
        return rowNos;
      };
      return (
        <>
          {formValues.length <= 4
            ? formValues.map((element, index) => (
                <div className="form-inline" key={index}>
                  <label>{index + 1}</label>
    
                  <input
                    type="text"
                    value={element.inputVal1}
                    onChange={(e) =>
                      onChangeFieldValue(index, "inputValue1", e.target.value)
                    }
                  />
                  <input
                    type="text"
                    value={element.inputVal2}
                    onChange={(e) =>
                      onChangeFieldValue(index, "inputValue2", e.target.value)
                    }
                  />
                  {rows(element, index)}
    
                  <button
                    className="button add"
                    type="button"
                    onClick={() => addFormFields()}
                  >
                    Add
                  </button>
    
                  <button
                    type="button"
                    className="button remove"
                    onClick={() => removeFormFields(index)}
                  >
                    Remove
                  </button>
                </div>
              ))
            : ""}
          <button
            type="button"
            className="button remove"
            onClick={(e) => saveFields(e)}
          >
            Save
          </button>
          <button
            type="button"
            className="button remove"
            //onClick={(e) => cancelFields(e)}
          >
            cancel
          </button>
        </>
      );
    };
    
    export default App;
    

    【讨论】:

    • 在发送数据以及从后端发送数据时,dependentParams 值将作为字符串而不是数组或 obj。例如,第二行作为值“1”,第三行作为 depdenpdent 参数值是'1,2',如果选中所有复选框,则第 4 行为 '1,2,3'。不是数组,而是字符串。
    • 是的,我以 dependentParams 数组为例,您可以按照需要使用它,只需将该对象数组更改为字符串数组或字符串本身,然后在每个复选框上检查index + 1 是否存在于dependentParams 中,如果存在则返回 true 进行检查,如果不存在则返回 false 进行检查,显示您需要发送到服务器的最终数据样本,我将根据该代码修改代码
    • 我尝试过使用字符串,上一个状态不适用于第二行。它显示为“”。我到服务器的数据将是 [{orderno: 1, inputValue1: "", inputValue2: "",dependentParams: ""},{orderno: 2, inputValue1: "", inputValue2: "",dependentParams: "1" //如果参数 1 被选中。如果它没有被选中,那么它将 ""} {orderno: 2, inputValue1: "", inputValue2: "",dependentParams: "1,2"//如果参数 1,2 被选中。如果它未选中则它将“”
    • 显示你需要发送到服务器的结果数据
    • {"data":"xxx","DbData":"xxx","SQlData":"xxx","overallData":{"formValues":[{"orderno":1, "inputValue1":"tes123","inputValue2":"tes123","dependentParams":""},{"orderno":2,"inputValue1":"tes123","inputValue2":"tes123","dependentParams" :"1"},{"orderno":3,"inputValue1":"tes123","inputValue2":"tes123","dependentParams":"1,2"},{"orderno":4,"inputValue1" :"tes123","inputValue2":"tes123","dependentParams":"1,3"}]}}
    【解决方案2】:

    将复选框选中的属性条件更改为

     checked={orderno === 1 ? true : false}
    

    再试一次

    【讨论】:

    • 我也用 null 试过了,我无法再次取消选中该值并将其发送到后端,
    猜你喜欢
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-08
    • 1970-01-01
    • 2018-06-25
    • 2020-03-22
    • 1970-01-01
    相关资源
    最近更新 更多