React MUI Multiple Select with Checkboxes not Check marking Initial Selected Options
React MUI Multiple Select with Checkboxes not Check marking Initial Selected Options
我在React
和MUI
还是新人,请饶了我一命吧。我正在学习使用复选框构建多个 Select 选项,并且我已经从数组中填充了下拉选项。
我还设置了 initial/default 状态选项。 initial/default 状态选项(Nintendo 和 XBoX)显示在主输入 Select 字段中,但遗憾的是未在下拉复选框中选中标记,如下面的屏幕截图所示。
Screenshot 1
我想要实现的是这样(默认状态下的所有选定选项(Nintendo 和 XBoX)在初始页面加载时显示在复选框中):
Screenshot 2
这是我在 https://stackblitz.com/edit/react-rahqrq?file=demo.js
中的现场演示编码
我很困惑,我可以勾选下拉列表中的所有其他选项复选框,但州的默认初始选项除外。它不可点击且不可更改,我不知道为什么。非常感谢任何提示和线索,提前致谢,请原谅我糟糕的语法和最诚挚的问候。
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>
);
}
您需要 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
我在React
和MUI
还是新人,请饶了我一命吧。我正在学习使用复选框构建多个 Select 选项,并且我已经从数组中填充了下拉选项。
我还设置了 initial/default 状态选项。 initial/default 状态选项(Nintendo 和 XBoX)显示在主输入 Select 字段中,但遗憾的是未在下拉复选框中选中标记,如下面的屏幕截图所示。
Screenshot 1
我想要实现的是这样(默认状态下的所有选定选项(Nintendo 和 XBoX)在初始页面加载时显示在复选框中):
Screenshot 2
这是我在 https://stackblitz.com/edit/react-rahqrq?file=demo.js
中的现场演示编码我很困惑,我可以勾选下拉列表中的所有其他选项复选框,但州的默认初始选项除外。它不可点击且不可更改,我不知道为什么。非常感谢任何提示和线索,提前致谢,请原谅我糟糕的语法和最诚挚的问候。
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>
);
}
您需要 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