reactjs - 反应的材料 UI 中的下拉列表替代方案
问题描述
我目前正在使用simple-menu
材料 UI,如这里的代码框所示。在我的反应应用程序中,我在 Primereact 对话框中显示此菜单。
但是,我的主要要求是在对话框中显示一个下拉列表,以便当用户选择某些东西时,它可以被选中,我可以根据它做一些事情。例如,如果用户选择Car
,我可以看到它被选中。另外,我有一些与每个条目相关的值。例如,Company
有价值0
、Car
有价值1
和Office
有价值2
。
所以我计划在对话框中有一些按钮,以便在选择列表中的项目并选择Ok
按钮后,我可以在 web 服务调用中发送与所选项目关联的值。
我能找到的最接近的是 simplelist:
https://material-ui.com/components/lists/#simple-list
但没有什么接近下拉列表。我在这里错过了什么吗?
更多信息:
对话框如下所示:
比方说,当我选择一个项目时,比方说,Car
它不会显示Car
,但会显示Open Menu
我不想要的。
解决方案
我已经实现的是,当打开下拉列表并选择了某些选项时,用户可以看到他们选择的内容,并且在选择某些选项时就无法关闭,并且在控制台中您可以看到索引号选择了哪个选项。
您可以按照以下代码:
import React, { useState } from "react";
import Button from "@material-ui/core/Button";
import Menu from "@material-ui/core/Menu";
import MenuItem from "@material-ui/core/MenuItem";
import { makeStyles } from "@material-ui/core/styles";
const useStyles = makeStyles((theme) => ({
root: {
width: "100%",
maxWidth: 360,
backgroundColor: theme.palette.background.paper
}
}));
export default function SimpleMenu() {
const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);
const [visval, setVisval] = useState("Open Menu");
const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {
setAnchorEl(event.currentTarget);
//console.log(event.currentTarget);
};
const handleClose = () => {
setAnchorEl(null);
};
const classes = useStyles();
const [selectedIndex, setSelectedIndex] = React.useState();
const handleListItemClick = (event, index) => {
setSelectedIndex(index);
handleClose();
//console.log(index);
if (index === 0) {
setVisval("Company");
} else if (index === 1) {
setVisval("Car");
} else {
setVisval("Office");
}
};
return (
<div>
<Button
aria-controls="simple-menu"
aria-haspopup="true"
onClick={handleClick}
>
{visval}
</Button>
<Menu
id="simple-menu"
anchorEl={anchorEl}
keepMounted
open={Boolean(anchorEl)}
onClose={handleClose}
>
<MenuItem
data-my-value={1}
selected={selectedIndex === 0}
onClick={(event) => handleListItemClick(event, 0)}
>
Company
</MenuItem>
<MenuItem
data-my-value={2}
selected={selectedIndex === 1}
onClick={(event) => handleListItemClick(event, 1)}
>
Car
</MenuItem>
<MenuItem
data-my-value={3}
selected={selectedIndex === 2}
onClick={(event) => handleListItemClick(event, 2)}
>
Office
</MenuItem>
</Menu>
</div>
);
}
您可以在此处签出更新和工作的代码框
编辑 :
我已经实现了您的要求,即,当我们选择某个选项时,显示三个选项的菜单应该关闭,并且应该在Open Menu
. 但我看到的是代码不再可重用并且变得太大(我意识到这一点)。
如果您希望代码最小化,请遵循以下建议
建议:
我看到 Material-uiautocomplete
只是用干净的代码完成了工作。它为您提供了一组选项,例如dropdown menu
,当用户选择某项时,用户会看到所选选项。
您可以将相同的代码迁移到对话框的内容中,它会正常工作。
推荐阅读
- python - Selenium 如何获取文本元素
- python - 具有可变参数的装饰器
- python - bot.remove_command('help') AttributeError: 'Client' object has no attribute 'remove_command'
- flutter - 如何将新的食品数据插入特定的类别 ID
- selenium - Selenium - TakesScreenshot - java - 转换为 jpg 时遇到问题
- python - 拍摄 rgb 图像通道时出现合并错误
- .net - 使用 Blazor 模式和身份验证状态
- python - 按标签绘制单词频率
- java - 在java中定义递归函数
- haskell - 为什么精确长度列表模式匹配会触发 GHC 中的不完整单模式?