My *_*tna 7 javascript reactjs material-ui selectinput
我还是个新手React,MUI所以请饶我一命。我正在学习使用复选框构建多个选择选项,并且我已经从数组中填充了下拉选项。
我还设置了初始/默认状态选项。初始/默认状态选项(Nintendo 和 XBoX)显示在主输入选择字段中,但不幸的是没有在下拉复选框中选中标记,如下面的屏幕截图所示。
我想要实现的是这样的(默认状态下所有选定的选项(Nintendo 和 XBoX)都显示在初始页面加载时的复选框上):
这是我在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>
);
}
Run Code Online (Sandbox Code Playgroud)
您需要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>
));
}
Run Code Online (Sandbox Code Playgroud)
代码沙箱 => https://stackblitz.com/edit/react-rahqrq-sd2m2b?file=demo.js