javascript - 根据索引 react setState 多个数组

标签 javascript arrays reactjs input

我有一个相当棘手的问题要问, 我正在开发一个接受来自数据库的多个输入的页面 这样我就生成了几个输入(输入的数量不是恒定的)

基本上是这样的:

 const form = this.state.inputs.map((input, i) => {
      if (input) {
        return (
          <div key={i}>
            <div>
              <label htmlFor={input.inputLabel}>{input.inputName}</label>
            </div>
            <div className="form-input">
              <input
                name={`${input.inputName}-${i}`}
                type={input.inputType}
                id={input.inputLabel}
                onChange={this.onChange}
              />
            </div>
          </div>
        );
      }
    });

生成具有未知数量值的表单后(取决于数据库) 我想保存该表单的所有值,但因为我不知道输入的数量,所以我创建了 2 个数组(我需要保存值和名称,以便稍后在不同的页面中显示)

  state = {
  ....
    inputData: {
      names: [],
      values: []
    }
  ....
  };

但我在实际保存 setState 中的值时遇到了麻烦

 onChange = e => {
    e.preventDefault();
    const { name, value } = e.target;
    var nameIndex = name.split('-');
    const names = [];
    const values = [];
    values[nameIndex[1]] = value;
    names[nameIndex[1]] = nameIndex[0];
    const inputData = { names, values };
    this.setState({ inputData });
  };

setState 的工作原理如下: 在我的 map 上,我给每个输入一个名称,其中包含 map 生成的索引,因此名称类似于“inputname-1”,我使用 split 取出 1 并更新我在 setState 中所做的两个数组(值,names) 并且每次用户在输入中写入时,它都会更改数组内的值,如下所示:values[1]=(users input...) , 但我注意到,例如,如果我更改第二个值,则索引 1 和 0 中他之前的值将变为未定义,我是否遗漏了某些内容?

最佳答案

您正在创建一个新的 namesvalues 数组,其中仅填充一个索引。这就是为什么您要覆盖数组中的其他索引

如果您只想更新特定索引而不进行突变,您可以执行以下操作:

const { name, value } = e.target;
const [key, index] = name.split('-');

this.setState(prevState => ({
   ...prevState,
   inputData: {
      values: Object.assign([], {...prevState.inputData.values }, { [index]: value }),
      names: Object.assign([], {...prevState.inputData.names }, { [index]: key })
   }
}))

另一种选择是使用扩展语法获取 prevState.inputData.values 的副本,并更新其在特定索引处的值,然后将其设置为 inputData:

const { name, value } = e.target;
const [key, index] = name.split('-');

this.setState(prevState => {
  const cloneValues = [...prevState.inputData.values],
        cloneNames = [...prevState.inputData.names];

  cloneValues[index] = value;
  cloneNames[index] = key;

  return {
    ...prevState,
    inputData: {
      values: cloneValues,
      names: cloneNames
    }
  }
})

关于javascript - 根据索引 react setState 多个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54635838/

相关文章:

javascript - 无法在react中使用state读取null的属性

javascript - 在大型 DOM 中使用 document.querySelector 更快地搜索元素

javascript - 向下滚动时从 1 增加到 100

ios - 从 User * 分配给 NSArray * 的不兼容指针类型

reactjs - Axios POST 使用 CORS 请求执行错误 block ,浏览器开发工具显示 200

javascript - 是否可以使用 C++ 作为 Electron.js 的后端?

c - 打印二维数组名称和等级

java - list.toArray() 同意将 A 类型的项目传输到 B[] 类型的数组

javascript - 如何在不进行轮询的情况下从我的 Ruby REST/CRUD API 持续更新我的 ReactJS 客户端?

reactjs - Apollo Query 组件返回结果后调度 redux 操作