React-select 多下拉onChange实现
React-select multiple drop downs onChange implementation
使用 react-select 在我的 Mongo 中实现了基于数组字段的动态下拉列表,就像这样。
import React, { useState } from 'react'
import Select from 'react-select'
const NonFormikSelect = (props) => {
const [selectedOptions, setSelectedOptions] = useState([])
let options1 = props.member.members.map(member => ({
label: member.MemberName,
value: member.MemberName
}))
console.log(options1)
const selectChangeHandler = (event, numberofgroups) => {
}
const newValues = props.nogot.tournament.TournamentGroups.map((numberofgroups) => {
return (
<Select
key={numberofgroups}
name={numberofgroups}
isMulti
options={options1}
value={numberofgroups in selectedOptions ? selectedOptions[numberofgroups]: ""}
onChange={(event) => selectChangeHandler(event, numberofgroups)}
/>
)
})
return (
newValues
)
}
export default NonFormikSelect
我的困难在于更改处理函数。我尝试了多种组合并浏览了多个文档,但无法破解我想要的设计。这是我在这个组件中的状态声明
常量 [selectedOptions, setSelectedOptions] = useState([])
这是我想要的 onChange 功能。
假设 - 我的 map 函数输入数组有 2 个元素,所以这意味着 2 select 下拉列表将被推到前端,下拉列表中的值将通过另一个 options1 对象。正如 react-select 所期望的那样,它有一个标签和值键对。假设对象内部有 10 个键值对。
当用户打开表单时,他会看到 2 个下拉菜单。如果他 select 在第一个下拉列表中有 3 个名字,那么我希望这些名字不在第二个下拉列表中。在第二个下拉列表中,假设他 selects。然后需要将所有 8 个值提升到父组件,在 onSubmit 中我正在获取 API 并更新我的集合。
这可行吗?我 运行 没主意了。我的更改处理程序函数现在为空,因此不会在此处发布任何内容
您要查找的是层叠 select .
import "./styles.css";
import Select from "react-select";
import { useState } from "react";
const allOptions = [
{
label: "john",
value: 1
},
{
label: "joe",
value: 2
},
{
label: "joel",
value: 3
},
{
label: "jackie",
value: 4
}
];
const generateInitialState = (numberOfSelects) =>
numberOfSelects.map((item) => null);
const CustomSelectComponent = ({ value, options, onSelect }) => {
return (
<Select
value={value}
options={options}
isMulti
onChange={onSelect}
/>
);
};
export default function App() {
const [selectState, setSelectState] = useState(() =>
// increase the array elements to add more select fields
generateInitialState(["Group1", "Group2", "Group3"])
);
const onSelectValues = (value, index) => {
// clone state
const clonedSelectState = JSON.parse(JSON.stringify(selectState));
clonedSelectState[index] = value;
setSelectState(clonedSelectState);
};
return (
<div className="App">
{selectState.map((selectCount, index) => {
const options = getOptionsToRender(selectState, allOptions);
return (
<CustomSelectComponent
value={selectState[index]}
options={options}
onSelect={(value) => onSelectValues(value, index)}
key={index}
/>
);
})}
</div>
);
}
const getOptionsToRender = (allSelectedOptions, allOptions) => {
// convert [[{}, {}], [{}]] -> [{}, {}, {}]
const filteredOptions = allSelectedOptions.flatMap((options) => options);
const optionsToRender =
filteredOptions.length > 0
? allOptions.filter(
(option) =>
!filteredOptions.some(
(selectOption) =>
option && selectOption && option.value === selectOption.value
)
)
: allOptions;
return optionsToRender;
};
使用 react-select 在我的 Mongo 中实现了基于数组字段的动态下拉列表,就像这样。
import React, { useState } from 'react'
import Select from 'react-select'
const NonFormikSelect = (props) => {
const [selectedOptions, setSelectedOptions] = useState([])
let options1 = props.member.members.map(member => ({
label: member.MemberName,
value: member.MemberName
}))
console.log(options1)
const selectChangeHandler = (event, numberofgroups) => {
}
const newValues = props.nogot.tournament.TournamentGroups.map((numberofgroups) => {
return (
<Select
key={numberofgroups}
name={numberofgroups}
isMulti
options={options1}
value={numberofgroups in selectedOptions ? selectedOptions[numberofgroups]: ""}
onChange={(event) => selectChangeHandler(event, numberofgroups)}
/>
)
})
return (
newValues
)
}
export default NonFormikSelect
我的困难在于更改处理函数。我尝试了多种组合并浏览了多个文档,但无法破解我想要的设计。这是我在这个组件中的状态声明
常量 [selectedOptions, setSelectedOptions] = useState([])
这是我想要的 onChange 功能。
假设 - 我的 map 函数输入数组有 2 个元素,所以这意味着 2 select 下拉列表将被推到前端,下拉列表中的值将通过另一个 options1 对象。正如 react-select 所期望的那样,它有一个标签和值键对。假设对象内部有 10 个键值对。
当用户打开表单时,他会看到 2 个下拉菜单。如果他 select 在第一个下拉列表中有 3 个名字,那么我希望这些名字不在第二个下拉列表中。在第二个下拉列表中,假设他 selects。然后需要将所有 8 个值提升到父组件,在 onSubmit 中我正在获取 API 并更新我的集合。
这可行吗?我 运行 没主意了。我的更改处理程序函数现在为空,因此不会在此处发布任何内容
您要查找的是层叠 select .
import "./styles.css";
import Select from "react-select";
import { useState } from "react";
const allOptions = [
{
label: "john",
value: 1
},
{
label: "joe",
value: 2
},
{
label: "joel",
value: 3
},
{
label: "jackie",
value: 4
}
];
const generateInitialState = (numberOfSelects) =>
numberOfSelects.map((item) => null);
const CustomSelectComponent = ({ value, options, onSelect }) => {
return (
<Select
value={value}
options={options}
isMulti
onChange={onSelect}
/>
);
};
export default function App() {
const [selectState, setSelectState] = useState(() =>
// increase the array elements to add more select fields
generateInitialState(["Group1", "Group2", "Group3"])
);
const onSelectValues = (value, index) => {
// clone state
const clonedSelectState = JSON.parse(JSON.stringify(selectState));
clonedSelectState[index] = value;
setSelectState(clonedSelectState);
};
return (
<div className="App">
{selectState.map((selectCount, index) => {
const options = getOptionsToRender(selectState, allOptions);
return (
<CustomSelectComponent
value={selectState[index]}
options={options}
onSelect={(value) => onSelectValues(value, index)}
key={index}
/>
);
})}
</div>
);
}
const getOptionsToRender = (allSelectedOptions, allOptions) => {
// convert [[{}, {}], [{}]] -> [{}, {}, {}]
const filteredOptions = allSelectedOptions.flatMap((options) => options);
const optionsToRender =
filteredOptions.length > 0
? allOptions.filter(
(option) =>
!filteredOptions.some(
(selectOption) =>
option && selectOption && option.value === selectOption.value
)
)
: allOptions;
return optionsToRender;
};