首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果下拉列表关闭,如何设置默认选中的所有复选框?

如果下拉列表关闭,如何设置默认选中的所有复选框?
EN

Stack Overflow用户
提问于 2022-04-06 14:00:49
回答 2查看 193关注 0票数 0

我使用的是材料UI多重选择,我的目标是设置所有选中的复选框,包括All,如果在关闭下拉列表后没有检查任何复选框。

因此,如果没有被选中,并且下拉列表被关闭,我希望所有复选框都被选中。我已经创建了一个名为booleanopen状态,它将在下拉列表关闭时触发。

我有isAllSelected布尔值,如果全部被选中,它也会变为true。所以这就是我试图通过布尔人来实现的方式,但是有些东西不起作用。下面的演示沙箱链接和代码示例

代码语言:javascript
运行
复制
import React, { useState } from "react";
import InputLabel from "@mui/material/InputLabel";
import Checkbox from "@mui/material/Checkbox";
import ListItemIcon from "@mui/material/ListItemIcon";
import ListItemText from "@mui/material/ListItemText";
import MenuItem from "@mui/material/MenuItem";
import FormControl from "@mui/material/FormControl";
import Select from "@mui/material/Select";
import { MenuProps, useStyles, options } from "./utils";

function App() {
  const [open, setOpen] = React.useState(false);
  const handleOpen = () => {
    setOpen(true);
  };

  const handleClose = () => {
    setOpen(false);
  };
  const classes = useStyles();
  const [selected, setSelected] = useState(options);
  const isAllSelected =
    options.length > 0 && selected.length === options.length;

  const handleChange = (event) => {
    const value = event.target.value;
    if (value[value.length - 1] === "all" && open) {
      setSelected(selected.length === options.length ? [] : options);
      return;
    }
    setSelected(value);
  };
  console.log("open", open);
  console.log("isAllSelected", isAllSelected);

  return (
    <FormControl className={classes.formControl}>
      <InputLabel id="mutiple-select-label">Multiple Select</InputLabel>
      <Select
        open={open}
        onOpen={handleOpen}
        onClose={handleClose}
        labelId="mutiple-select-label"
        multiple
        value={selected}
        onChange={handleChange}
        renderValue={(selected) =>
          !isAllSelected ? selected.join(", ") : "alle"
        }
        MenuProps={MenuProps}
      >
        <MenuItem
          value="all"
          classes={{
            root: isAllSelected ? classes.selectedAll : ""
          }}
        >
          <ListItemIcon>
            <Checkbox
              //defaultChecked={!isAllSelected}
              classes={{ indeterminate: classes.indeterminateColor }}
              checked={!isAllSelected && !open}
              indeterminate={
                selected.length > 0 && selected.length < options.length
              }
            />
          </ListItemIcon>
          <ListItemText
            classes={{ primary: classes.selectAllText }}
            primary="Select All"
          />
        </MenuItem>
        {options.map((option) => (
          <MenuItem key={option} value={option}>
            <ListItemIcon>
              <Checkbox
                //defaultChecked
                checked={
                  !isAllSelected && !open ? true : selected.indexOf(option) > -1
                }
              />
            </ListItemIcon>
            <ListItemText primary={option} />
          </MenuItem>
        ))}
      </Select>
    </FormControl>
  );
}

export default App;
EN

回答 2

Stack Overflow用户

发布于 2022-04-06 14:40:48

您需要更新复选框的状态,一旦更改了默认设置,就可以使用defaultChecked

代码语言:javascript
运行
复制
<input type="checkbox" defaultChecked={this.state.chkbox} onChange={this.handleChangeChk} />
票数 0
EN

Stack Overflow用户

发布于 2022-04-06 17:52:58

我解决了这个问题,通过useEffect更新了setter值。我正在检查下拉列表是否关闭,没有检查/选择任何内容,然后包装selected数组中的所有元素。

代码与演示沙箱链接

代码语言:javascript
运行
复制
 React.useEffect(() => {
    if (selected.length < 1 && !open) {
      setSelected(options);
    }
  }, [open, isAllSelected, selected]);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71768177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档