如何动态生成多个 MUI Select 元素及其选项?
How can I dynamically generate several MUI Select elements and their options?
根据现有数据,我正在动态生成多个 MUI“
例如给定数据:
const groups = [{name: "group1",group_id: 1}, {name: "group2", group_id: 2}];
const options = [
{name: "option1", option_id: 1, group_id: 1},
{name: "option2", option_id: 2, group_id: 1},
{name: "option3", option_id: 3, group_id: 1},
{name: "option4", option_id: 4, group_id: 2},
{name: "option5", option_id: 5, group_id: 2},
{name: "option6", option_id: 6, group_id: 2},
]
使用此数据,生成了两个“”元素。每个都有不同的 3 个选项。当我 select 使用第一个“”元素时,第二个“”元素中的值也会改变。
我的元素生成代码:
const [selectedElements, setSelectedElements] = React.useState([]);
const onSelectionChange = (event, serviceGroup) => {
const value = event.target.value;
setSelectedElements(
typeof value === 'string' ? value.split(',') : value,
);
}
return (
<div>
{
groups.map(function(group) {
return (
<Select
multiple
value={selectedElements}
onChange={(e)=>onSelectionChange(e, group)}
id={group.group_id}
renderValue={(selected) => selected.join(', ')}
>
{
options.map(function (option) {
if (option.group_id === group.group_id) {
return (
<MenuItem
key={option.option_id}
value={option.name}
>
<ListItemText primary={option.name} />
<Checkbox checked={selectedElements.indexOf(option.name) > -1}/>
</MenuItem>
)
}
})
}
</Select>
)
})
}
</div>
)
我知道“value={selectedElements}”会导致每个动态生成的“”元素具有相同的值,因此如果其中一个改变了它的值,其他的也会改变它们的价值。
为了解决这个问题,我尝试使用 const [selectedElementsObj, setSelectedElementsObj] = React.useState({});
- 一个对象状态,然后将“value={selectedElements}”替换为“value={selectedElementsObj[group.name]}”。
在 onSelectionChange 函数中,我创建了一个数组对象,因此在 selectedElementsObj 中我将为每个“
const objCopy = Object.assign({}, selectedElementsObj);
objCopy[group.name] = typeof value === 'string' ? value.split(',') : value;
setSelectedElementsObj(objCopy);
我的尝试遇到的问题是它无法呈现并且出现白屏。
我希望我清楚地描述了我的问题,这里是 codesandbox 我在这里展示的例子!
这里的问题是 onChange 事件,您没有为该特定项目设置值(正如您所说)。因此,要以不同方式识别每个元素,selectedElements
或 selectedElementsObj
中必须有特定的键,我们可以根据这些键知道要为该特定 id 设置此值。
为了解决这个问题,我所做的是将 seletedElements
设置为 obj 组数组。
const [selectedElements, setSelectedElements] = React.useState(groups);
然后用它来映射 Select 组件,并根据 selectedElements 值更改其值。
selectedElements.map(function (group) {
return (
<Select
style={{ marginBottom: "10px" }}
multiple
value={group?.value || []}
onChange={(e) => onSelectionChange(e, group)}
id={group.group_id}
renderValue={(selected) => selected.join(", ")}
sx={{
"& legend": { display: "none" },
"& fieldset": { top: 0 }
}}
>
{options.map(function (option) {
if (option.group_id === group.group_id) {
return (
<MenuItem key={option.option_id} value={option.name}>
<ListItemText primary={option.name} />
<Checkbox
checked={selectedElements.indexOf(option.name) > -1}
/>
</MenuItem>
);
}
})}
</Select>
);
})}
剩下的最后一部分是在该对象中分配(而不是在此处创建)该值,为此我在 onChange 函数调用中执行了此操作:
selectedElements.map(item => {
if(item.group_id === group.group_id)
{
item.value = typeof value === "string" ? value.split(",") : value
}
})
根据现有数据,我正在动态生成多个 MUI“
例如给定数据:
const groups = [{name: "group1",group_id: 1}, {name: "group2", group_id: 2}];
const options = [
{name: "option1", option_id: 1, group_id: 1},
{name: "option2", option_id: 2, group_id: 1},
{name: "option3", option_id: 3, group_id: 1},
{name: "option4", option_id: 4, group_id: 2},
{name: "option5", option_id: 5, group_id: 2},
{name: "option6", option_id: 6, group_id: 2},
]
使用此数据,生成了两个“
我的元素生成代码:
const [selectedElements, setSelectedElements] = React.useState([]);
const onSelectionChange = (event, serviceGroup) => {
const value = event.target.value;
setSelectedElements(
typeof value === 'string' ? value.split(',') : value,
);
}
return (
<div>
{
groups.map(function(group) {
return (
<Select
multiple
value={selectedElements}
onChange={(e)=>onSelectionChange(e, group)}
id={group.group_id}
renderValue={(selected) => selected.join(', ')}
>
{
options.map(function (option) {
if (option.group_id === group.group_id) {
return (
<MenuItem
key={option.option_id}
value={option.name}
>
<ListItemText primary={option.name} />
<Checkbox checked={selectedElements.indexOf(option.name) > -1}/>
</MenuItem>
)
}
})
}
</Select>
)
})
}
</div>
)
我知道“value={selectedElements}”会导致每个动态生成的“
为了解决这个问题,我尝试使用 我的尝试遇到的问题是它无法呈现并且出现白屏。
我希望我清楚地描述了我的问题,这里是 codesandbox 我在这里展示的例子!const [selectedElementsObj, setSelectedElementsObj] = React.useState({});
- 一个对象状态,然后将“value={selectedElements}”替换为“value={selectedElementsObj[group.name]}”。
在 onSelectionChange 函数中,我创建了一个数组对象,因此在 selectedElementsObj 中我将为每个“const objCopy = Object.assign({}, selectedElementsObj);
objCopy[group.name] = typeof value === 'string' ? value.split(',') : value;
setSelectedElementsObj(objCopy);
这里的问题是 onChange 事件,您没有为该特定项目设置值(正如您所说)。因此,要以不同方式识别每个元素,selectedElements
或 selectedElementsObj
中必须有特定的键,我们可以根据这些键知道要为该特定 id 设置此值。
为了解决这个问题,我所做的是将 seletedElements
设置为 obj 组数组。
const [selectedElements, setSelectedElements] = React.useState(groups);
然后用它来映射 Select 组件,并根据 selectedElements 值更改其值。
selectedElements.map(function (group) {
return (
<Select
style={{ marginBottom: "10px" }}
multiple
value={group?.value || []}
onChange={(e) => onSelectionChange(e, group)}
id={group.group_id}
renderValue={(selected) => selected.join(", ")}
sx={{
"& legend": { display: "none" },
"& fieldset": { top: 0 }
}}
>
{options.map(function (option) {
if (option.group_id === group.group_id) {
return (
<MenuItem key={option.option_id} value={option.name}>
<ListItemText primary={option.name} />
<Checkbox
checked={selectedElements.indexOf(option.name) > -1}
/>
</MenuItem>
);
}
})}
</Select>
);
})}
剩下的最后一部分是在该对象中分配(而不是在此处创建)该值,为此我在 onChange 函数调用中执行了此操作:
selectedElements.map(item => {
if(item.group_id === group.group_id)
{
item.value = typeof value === "string" ? value.split(",") : value
}
})