React 动态添加 select 输入字段
React dynamic add select input field
我正在尝试动态创建一个 select 字段。点击添加按钮时,会动态添加select个字段。我遇到了值不变的问题。
我的代码可以在codesandbox上查看:
https://codesandbox.io/s/react-select-field-dynamically-uo4dy?file=/src/App.js
我看到了三个问题。
首先,您只有一个 handleRoomChange 函数,它试图同时处理房间变化和棋盘变化。您可能也应该有一个 handleBoardChange 函数。
其次,如果你输出option
到handleRoomChange里面的控制台,你会注意到option.value
是一个数字。因此,当您继续将 list[index][value]
设置为 value
时,您的意思是您希望(例如)roomInputs[1][1]
为 1。roomInputs[1]
没有 1
属性,这就是为什么您最终会在提交时在对象中得到错误的属性。您需要将 roomInputs[1].roomType
设置为值,而不是(在您编写 handleBoardChange 方法时将 boardBasic
属性 设置为值)。
第三,您正在尝试使用对象解构将 object.value
分配给您的 value
变量...但是您正在尝试解构 object.value
而不是解构 object
.因此,每次 运行 函数时,value
就是 undefined
。用 const { value } = option;
替换赋值,您将开始返回定义的值。
看看我的变化:
// I added a 3rd argument for the name:
const handleRoomChange = (option, index, name) => {
const value = option.value; // you had this as 'const { value } = option.value' which dereferences value twice
console.log(value);
const list = [...roomInputs];
list[index][name] = value; //you had this as list[index][value]
setRoomInputs(list);
};
// onChange passes the name as 3rd argument to handleRoomChange
<Select
name="boardBasic"
placeHolder="Board"
value={options.value}
onChange={option => handleRoomChange(option, i, "boardBasic")}
options={options}
styles={{
menu: (provided) => ({ ...provided, zIndex: 9999 })
}}
/>
我正在尝试动态创建一个 select 字段。点击添加按钮时,会动态添加select个字段。我遇到了值不变的问题。
我的代码可以在codesandbox上查看:
https://codesandbox.io/s/react-select-field-dynamically-uo4dy?file=/src/App.js
我看到了三个问题。
首先,您只有一个 handleRoomChange 函数,它试图同时处理房间变化和棋盘变化。您可能也应该有一个 handleBoardChange 函数。
其次,如果你输出option
到handleRoomChange里面的控制台,你会注意到option.value
是一个数字。因此,当您继续将 list[index][value]
设置为 value
时,您的意思是您希望(例如)roomInputs[1][1]
为 1。roomInputs[1]
没有 1
属性,这就是为什么您最终会在提交时在对象中得到错误的属性。您需要将 roomInputs[1].roomType
设置为值,而不是(在您编写 handleBoardChange 方法时将 boardBasic
属性 设置为值)。
第三,您正在尝试使用对象解构将 object.value
分配给您的 value
变量...但是您正在尝试解构 object.value
而不是解构 object
.因此,每次 运行 函数时,value
就是 undefined
。用 const { value } = option;
替换赋值,您将开始返回定义的值。
看看我的变化:
// I added a 3rd argument for the name:
const handleRoomChange = (option, index, name) => {
const value = option.value; // you had this as 'const { value } = option.value' which dereferences value twice
console.log(value);
const list = [...roomInputs];
list[index][name] = value; //you had this as list[index][value]
setRoomInputs(list);
};
// onChange passes the name as 3rd argument to handleRoomChange
<Select
name="boardBasic"
placeHolder="Board"
value={options.value}
onChange={option => handleRoomChange(option, i, "boardBasic")}
options={options}
styles={{
menu: (provided) => ({ ...provided, zIndex: 9999 })
}}
/>