我正在try 创建一个带有手风琴包装的单选按钮功能的复选框.问题是,我一次只需要 Select 一项.如果已标记,则在 Select 另一项时应为未标记.

  1. 我创建了筛选器组件
import React, { useState } from "react";
import Checkbox from "@mui/material/Checkbox";
import { FormGroup } from "@mui/material";
import { FormControlLabel } from "@mui/material";


function FilterComponent (props) {
    const [selectedOption, setSelectedOption] = useState("");

    const handleChange = (event) => {

        setSelectedOption(event.target.value);
        console.log(selectedOption)

    };

    return (
        <FormGroup>
            <FormControlLabel
                control={
                    <Checkbox
                        checked={props.checked}
                        onChange={handleChange}
                        value={props.value}
                    />
                }
                label={props.label}
            />
        </FormGroup>
    );
};



export default FilterComponent;
  1. 将其包裹在手风琴中,并添加滤镜组件和贴图
import React, { useState } from "react";
import Accordion from '@mui/material/Accordion';
import AccordionDetails from '@mui/material/AccordionDetails';
import AccordionSummary from '@mui/material/AccordionSummary';
import Typography from '@mui/material/Typography';
import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
import filterItem from "../sortingFilterItems";
import FilterComponent from "./filterComponent";


function CreateSortingFilter(filterItem) {
    return (
        <FilterComponent
            key={filterItem.id}
            value={filterItem.value}
            label={filterItem.label}
        />
    );
}


export default function ControlledAccordions() {
    const [expanded, setExpanded] = useState(false);
const[label, setLabel] = useState("Collapsed filters");

    const handleChange = (panel) => (event, isExpanded) => {
        setExpanded(isExpanded ? panel : false);
        setLabel (isExpanded ? "Expanded filters" : "Collapsed filters");
    };


    return (
        <div>
            <Accordion expanded={expanded === 'panel'} onChange={handleChange('panel')}>
                <AccordionSummary
                    expandIcon={<ExpandMoreIcon/>}
                    aria-controls="panel-content"
                    id="1"
                >

                    <Typography onChange={handleChange('panel')} sx={{color: 'text.secondary'}}>{label}</Typography>
                </AccordionSummary>
                <AccordionDetails>
                    {filterItem.map(CreateSortingFilter)}
                </AccordionDetails>
            </Accordion>
        </div>
    );
}

  1. 项目ID值和标签存储在单独的文件中
const filterItem = [
  { id: 1, value: 1, label: "Recommended" },
  { id: 2, value: 2, label: "Recently Added" },
  { id: 3, value: 3, label: "Expiring Soon" },
  { id: 4, value: 4, label: "Most Rated" },
  { id: 5, value: 5, label: "Price: Low → High" },
  { id: 6, value: 6, label: "Price: High → Low" },
];

export default filterItem;

如果另一项被选中,如何拒绝上一次的选中?

推荐答案

根据this article linked in the Material UI docs,当您需要向最终用户呈现mutually exclusive个选项时,您不应该使用复选框.复选框使用户能够 Select any number个选项--这就是他们的目的.对于互斥 Select (用户必须从两个或更多选项中只 Select 一个),您需要改用Radio Buttons.

Javascript相关问答推荐

为什么我的useDispatch挂钩在这里设置不正确?

IOS(React Native)中未找到模块SquareReaderSDK

如何使用CSS和JavaScript创建粘性、凝聚力的形状到形状(容器)变形?

如何解决这个未能在响应上执行json:body stream已读问题?

*ngFor和@代表输入decorator 和选角闭合

使用JavaScript单击上一个或下一个特定按钮创建卡滑动器以滑动单个卡

未捕获错误:在注销后重定向到/login页面时找不到匹配的路由

如何在不创建新键的情况下动态更改 map 中的项目?

为什么我的导航条打开状态没有在窗口addeventlistener(Reaction Js)中更新?

如何在coCos2d-x中更正此错误

未定义引用错误:未定义&Quot;而不是&Quot;ReferenceError:在初始化&Quot;之前无法访问';a';

NG/Express API路由处理程序停止工作

是否可以在Photoshop CC中zoom 路径项?

向数组中的对象添加键而不改变原始变量

我想将Sitecore搜索面过滤器从多个转换为单个

传递方法VS泛型对象VS事件特定对象

OnClick更改Json数组JSX中的图像源

如何组合Multer上传?

postman 预请求中的hmac/sha256内标识-从js示例转换

react 路由如何使用从加载器返回的数据