我在React
和MUI
还是新来的,所以请饶了我一命。我正在学习如何用复选框构建多个Select,并且我已经从Array中填充了下拉选项。
我还设置了初始/默认状态选项。初始/默认状态选项(任天堂& XBoX)显示在主输入选择字段中,但不幸的是没有在下拉复选框中选中,如下面的屏幕截图。
我试图实现的是这样(默认状态下的所有选定选项(任天堂和XBoX)都显示在初始页面加载的复选框中):
这是我在https://stackblitz.com/edit/react-rahqrq?file=demo.js中的现场演示编码
我很困惑,我可以勾选下拉列表中的所有其他选项复选框,除了来自State的默认初始选项。它是不可点击和不可改变的,我不知道为什么。任何提示和线索都是非常感谢的,谢谢,请原谅我糟糕的语法和最好的问候。
import * as React from 'react';
import OutlinedInput from '@mui/material/OutlinedInput';
import InputLabel from '@mui/material/InputLabel';
import MenuItem from '@mui/material/MenuItem';
import FormControl from '@mui/material/FormControl';
import ListItemText from '@mui/material/ListItemText';
import Select from '@mui/material/Select';
import Checkbox from '@mui/material/Checkbox';
const ITEM_HEIGHT = 48;
const ITEM_PADDING_TOP = 8;
const MenuProps = {
PaperProps: {
style: {
maxHeight: ITEM_HEIGHT * 4.5 + ITEM_PADDING_TOP,
width: 250,
},
},
};
const variants = [
{
id: 3,
name: 'Voucher',
},
{
id: 1,
name: 'Top Up',
},
{
id: 2,
name: 'Game Key',
},
{
id: 12,
name: 'Other',
},
{
id: 11,
name: 'Nintendo',
},
{
id: 10,
name: 'Xbox',
},
];
export default function MultipleSelectCheckmarks() {
const [variantName, setVariantName] = React.useState([{
id: 11,
name: 'Nintendo',
},{
id: 10,
name: 'Xbox'
},]);
const handleChange = (event) => {
const {
target: { value },
} = event;
const preventDuplicate = value.filter((v, i, a) => a.findIndex((t) => t.id === v.id) === i);
setVariantName(
// On autofill we get a the stringified value.
typeof preventDuplicate === 'string' ? preventDuplicate.split(',') : preventDuplicate
);
};
return (
<div>
<FormControl sx={{ m: 1, width: 300 }}>
<InputLabel id="demo-multiple-checkbox-label">Tag</InputLabel>
<Select
labelId="demo-multiple-checkbox-label"
id="demo-multiple-checkbox"
multiple
value={variantName}
onChange={handleChange}
input={<OutlinedInput label="Tag" />}
renderValue={(selected) => selected.map((x) => x.name).join(', ')}
MenuProps={MenuProps}
>
{variants.map((variant) => (
<MenuItem key={variant.id} value={variant}>
<Checkbox checked={variantName.indexOf(variant) > -1} />
<ListItemText primary={variant.name} />
</MenuItem>
))}
</Select>
</FormControl>
</div>
);
}
发布于 2021-11-27 15:56:08
您需要对初始列表中的每一项进行findIndex
,以使其成为checked
。
试试下面的样子
{
variants.map(variant => (
<MenuItem key={variant.id} value={variant}>
<Checkbox
checked={
variantName.findIndex(item => item.id === variant.id) >= 0
}
/>
<ListItemText primary={variant.name} />
</MenuItem>
));
}
代码沙箱=> https://stackblitz.com/edit/react-rahqrq-sd2m2b?file=demo.js
https://stackoverflow.com/questions/70136236
复制相似问题