【问题标题】:React MUI Multiple Select with Checkboxes not Check marking Initial Selected OptionsReact MUI Multiple Select with Checkboxes not Check marking Initial Selected Options
【发布时间】:2022-01-05 05:06:51
【问题描述】:

我还是 ReactMUI 的新手,所以请饶了我的命。我正在学习使用复选框构建多选选项,并且我已经从数组中填充了下拉选项。

我还设置了初始/默认状态选项。初始/默认状态选项(Nintendo 和 XBoX)显示在主输入选择字段中,但遗憾的是未在下拉复选框中选中标记,如下面的屏幕截图所示。

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>
  );
}

【问题讨论】:

    标签: javascript reactjs material-ui selectinput


    【解决方案1】:

    您需要将初始列表中每个项目的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

    【讨论】:

    • 嗨,非常感谢您的回复,我认为没有人会回答我的菜鸟问题 xD 所以,问题原来是将 indexOf 更改为 findIndex。谢谢你教我,我查看了你在 stackblitz 中的分叉代码。将其作为最佳答案
    • 哦,顺便说一下,从您的 stackblitz 代码中,一旦在初始状态(Nintendo,Xbox)上选中默认选项,它就不能取消选中,但其他可以取消选中,任何提示给我检查?提前致谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-07
    • 2022-12-01
    • 2020-10-20
    • 2015-05-17
    • 1970-01-01
    • 2022-12-19
    • 2018-11-14
    相关资源
    最近更新 更多