【Material-UI】按钮组:Split Button 详解

news2024/11/15 1:44:04

文章目录

    • 一、Split Button 概述
      • 1. 组件介绍
      • 2. 基本用法
    • 二、Split Button 的应用场景
      • 1. 提交操作
      • 2. 导出操作
      • 3. 文件操作
    • 三、Split Button 的样式定制
      • 1. 变体(Variants)
      • 2. 颜色(Colors)
    • 四、Split Button 的优势
      • 1. 提升用户体验
      • 2. 灵活性
      • 3. 视觉一致性
    • 五、注意事项
      • 1. 无障碍支持
      • 2. 交互反馈
      • 3. 布局调整
    • 六、总结

Material-UI 是一个非常流行的 React UI 框架,提供了丰富的组件来提升开发效率和用户体验。本文将详细介绍 Material-UI 中的 ButtonGroup 组件的 Split Button 功能。Split Button 可以通过下拉菜单改变按钮的操作,或用于立即触发相关操作。

一、Split Button 概述

1. 组件介绍

Split Button 是一种组合按钮,它由一个主按钮和一个下拉菜单按钮组成。主按钮用于执行默认操作,而下拉菜单按钮用于选择其他操作。这样,用户可以快速执行常用操作,同时也可以轻松访问其他选项。

2. 基本用法

以下是一个简单的示例,展示了如何使用 ButtonGroup 组件创建一个 Split Button:

import * as React from 'react';
import Button from '@mui/material/Button';
import ButtonGroup from '@mui/material/ButtonGroup';
import ArrowDropDownIcon from '@mui/icons-material/ArrowDropDown';
import ClickAwayListener from '@mui/material/ClickAwayListener';
import Grow from '@mui/material/Grow';
import Paper from '@mui/material/Paper';
import Popper from '@mui/material/Popper';
import MenuItem from '@mui/material/MenuItem';
import MenuList from '@mui/material/MenuList';

const options = ['Create a merge commit', 'Squash and merge', 'Rebase and merge'];

export default function SplitButton() {
  const [open, setOpen] = React.useState(false);
  const anchorRef = React.useRef(null);
  const [selectedIndex, setSelectedIndex] = React.useState(1);

  const handleClick = () => {
    console.info(`You clicked ${options[selectedIndex]}`);
  };

  const handleMenuItemClick = (event, index) => {
    setSelectedIndex(index);
    setOpen(false);
  };

  const handleToggle = () => {
    setOpen((prevOpen) => !prevOpen);
  };

  const handleClose = (event) => {
    if (anchorRef.current && anchorRef.current.contains(event.target)) {
      return;
    }

    setOpen(false);
  };

  return (
    <React.Fragment>
      <ButtonGroup
        variant="contained"
        ref={anchorRef}
        aria-label="Button group with a nested menu"
      >
        <Button onClick={handleClick}>{options[selectedIndex]}</Button>
        <Button
          size="small"
          aria-controls={open ? 'split-button-menu' : undefined}
          aria-expanded={open ? 'true' : undefined}
          aria-label="select merge strategy"
          aria-haspopup="menu"
          onClick={handleToggle}
        >
          <ArrowDropDownIcon />
        </Button>
      </ButtonGroup>
      <Popper
        sx={{
          zIndex: 1,
        }}
        open={open}
        anchorEl={anchorRef.current}
        role={undefined}
        transition
        disablePortal
      >
        {({ TransitionProps, placement }) => (
          <Grow
            {...TransitionProps}
            style={{
              transformOrigin:
                placement === 'bottom' ? 'center top' : 'center bottom',
            }}
          >
            <Paper>
              <ClickAwayListener onClickAway={handleClose}>
                <MenuList id="split-button-menu" autoFocusItem>
                  {options.map((option, index) => (
                    <MenuItem
                      key={option}
                      disabled={index === 2}
                      selected={index === selectedIndex}
                      onClick={(event) => handleMenuItemClick(event, index)}
                    >
                      {option}
                    </MenuItem>
                  ))}
                </MenuList>
              </ClickAwayListener>
            </Paper>
          </Grow>
        )}
      </Popper>
    </React.Fragment>
  );
}

在上述代码中,我们创建了一个 Split Button 组件,其中包括一个主要按钮和一个下拉菜单按钮。用户可以点击主按钮执行默认操作,或者点击下拉菜单按钮选择其他操作。

二、Split Button 的应用场景

1. 提交操作

在版本控制系统中,Split Button 可以用于选择不同的提交方式,如合并提交、压缩提交或变基提交。

<ButtonGroup variant="contained" ref={anchorRef} aria-label="Split button for commit actions">
  <Button onClick={handleClick}>{options[selectedIndex]}</Button>
  <Button
    size="small"
    aria-controls={open ? 'split-button-menu' : undefined}
    aria-expanded={open ? 'true' : undefined}
    aria-label="select commit strategy"
    aria-haspopup="menu"
    onClick={handleToggle}
  >
    <ArrowDropDownIcon />
  </Button>
</ButtonGroup>

2. 导出操作

在数据导出功能中,Split Button 可以让用户选择不同的导出格式,如 CSV、Excel 或 PDF。

<ButtonGroup variant="contained" ref={anchorRef} aria-label="Split button for export actions">
  <Button onClick={handleClick}>{options[selectedIndex]}</Button>
  <Button
    size="small"
    aria-controls={open ? 'split-button-menu' : undefined}
    aria-expanded={open ? 'true' : undefined}
    aria-label="select export format"
    aria-haspopup="menu"
    onClick={handleToggle}
  >
    <ArrowDropDownIcon />
  </Button>
</ButtonGroup>

3. 文件操作

在文件管理系统中,Split Button 可以用于选择不同的文件操作,如打开、重命名或删除。

<ButtonGroup variant="contained" ref={anchorRef} aria-label="Split button for file actions">
  <Button onClick={handleClick}>{options[selectedIndex]}</Button>
  <Button
    size="small"
    aria-controls={open ? 'split-button-menu' : undefined}
    aria-expanded={open ? 'true' : undefined}
    aria-label="select file action"
    aria-haspopup="menu"
    onClick={handleToggle}
  >
    <ArrowDropDownIcon />
  </Button>
</ButtonGroup>

三、Split Button 的样式定制

1. 变体(Variants)

ButtonGroup 组件支持多种按钮样式变体,包括 "text""outlined""contained"。这些变体决定了按钮的外观,如是否有边框、填充背景色等。

  • Text:无边框和背景色的按钮,适用于低优先级操作。
  • Outlined:带边框但无填充背景的按钮,适用于次要操作。
  • Contained:填充背景的按钮,适用于主要操作。
<ButtonGroup variant="outlined" ref={anchorRef} aria-label="Outlined split button">
  <Button onClick={handleClick}>{options[selectedIndex]}</Button>
  <Button
    size="small"
    aria-controls={open ? 'split-button-menu' : undefined}
    aria-expanded={open ? 'true' : undefined}
    aria-label="select action"
    aria-haspopup="menu"
    onClick={handleToggle}
  >
    <ArrowDropDownIcon />
  </Button>
</ButtonGroup>

2. 颜色(Colors)

ButtonGroup 组件支持多种颜色选择,包括 "primary""secondary""default" 等。可以根据主题或设计需求选择合适的颜色。

<ButtonGroup color="secondary" variant="contained" ref={anchorRef} aria-label="Secondary color split button">
  <Button onClick={handleClick}>{options[selectedIndex]}</Button>
  <Button
    size="small"
    aria-controls={open ? 'split-button-menu' : undefined}
    aria-expanded={open ? 'true' : undefined}
    aria-label="select action"
    aria-haspopup="menu"
    onClick={handleToggle}
  >
    <ArrowDropDownIcon />
  </Button>
</ButtonGroup>

四、Split Button 的优势

1. 提升用户体验

Split Button 能够将常用操作和其他选项集中在一个按钮组中,提升用户的操作效率,减少界面复杂度。

2. 灵活性

用户可以通过下拉菜单轻松选择不同的操作,而不需要在界面上显示多个按钮,占用额外的空间。

3. 视觉一致性

通过使用 ButtonGroup 组件,可以确保所有按钮具有一致的样式和行为,提升界面的整体美观性。

五、注意事项

1. 无障碍支持

在使用 ButtonGroup 时,应为每个按钮提供合适的 aria-label 属性,以确保使用屏幕阅读器的用户能够顺利使用。

2. 交互反馈

确保按钮组在不同的状态下(如悬停、点击)提供足够的交互反馈,以提升用户体验。

3. 布局调整

根据界面布局和用户需求,可以使用 sx 属性或自定义样式调整按钮组的间距、对齐方式等,确保按钮组在各个设备和分辨率下的良好表现。

六、总结

Material-UI 的 ButtonGroup 组件通过支持 Split Button,为开发者提供了更灵活的操作选项。Split Button 在提交操作、导出操作和文件操作等场景中具有广泛的应用。通过合理设置按钮组的变体和颜色,可以提升界面的视觉一致性和用户体验。希望本文能帮助你更好地理解和使用 Material-UI 的 Split Button 组件。

推荐:

  • JavaScript
  • react
  • vue

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1990436.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

江科大/江协科技 STM32学习笔记P20

文章目录 编码器接口测速定时器有关的库函数Encoder.cmain.c 编码器接口测速 编码器接口的初始化&#xff0c;第一步&#xff0c;RCC开启时钟&#xff0c;开启GPIO和定时器的时钟&#xff0c;第二步&#xff0c;配置GPIO&#xff0c;这里把PA6和PA7配置成输入模式&#xff0c;第…

【环绕字符串中唯一的子字符串】python刷题记录

R4-字符串 动态规划 class Solution:def findSubstringInWraproundString(self, s: str) -> int:dp[0]*26num1#dp初始化dp[ord(s[0])-ord(a)]1for c1,c2 in pairwise(s):if not (ord(c2)-ord(c1)-1)%26:num1else:num1dp[id]max(dp[id : ord(c2)-ord(a)],num)return sum(dp)p…

Java设计模式(适配器模式)

定义 将一个类的接口转换成客户希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作。 角色 目标抽象类&#xff08;Target&#xff09;&#xff1a;目标抽象类定义客户所需的接口&#xff08;在类适配器中&#xff0c;目标抽象类只能是接口&#xff09;。 适配器类…

笔记小结:《利用Python进行数据分析》之字符串操作(含正则表达式)

目录 字符串对象方法 使用split分割字符串 连接字符串 查找子串 字串计数 替换字串 字符串方法表 正则表达式 分割数量不定的空白符 匹配正则表达式的所有模式 匹配字符串 替换字符串 将字符串分组 带有分组功能的findall pandas矢量化字符串函数 Python能够成…

hongmeng开发

Image图片组件 Text组件 如在两个限定目录里面定义完后&#xff0c;也要在 base牡蛎下去定义一下&#xff0c;不然会报错 TextInput Button Slider 案例 State imageWidth:number30//构建 → 界面build() {Column(){Image($r(app.media.startIcon)).width(this.imageWidth)Te…

帆软填报报表单元格根据其它单元格内容决定另外的单元格可筛选什么值

效果图&#xff1a; 方法有三种&#xff1a; 方法一&#xff1a; 添加链接描述

基于sklearn的机器学习 — 支持向量机(SVM)

支持向量机&#xff08;SVM&#xff1a;support vector machine&#xff09;另一种功能强大、应用广泛的学习算法&#xff0c;可应用于分类、回归、密度估计、聚类等问题。SVM可以看作是感知器&#xff08;可被视为一种最简单形式的前馈神经网络&#xff0c;是一种二元线性分类…

AI在医学领域:使用眼底图像和基线屈光数据来定量预测近视

关键词&#xff1a;深度学习、近视预测、早期干预、屈光数据 儿童近视已经成为一个全球性的重大健康议题。其发病率持续攀升&#xff0c;且有可能演变成严重且不可逆转的状况&#xff0c;这不仅对家庭幸福构成威胁&#xff0c;还带来巨大的经济负担。当前的研究着重指出&#x…

Android Studio新版UI常用设置

新版UI固然好看&#xff0c;但启用后一些常用的功能也被初始化了&#xff0c;下面会说明如何设置一些常用的功能。 一、启用\禁用新版UI Setting -> Appearance & Behavior -> New UI -> Enable new UI 二、展示Git部分的Local Changes窗口 Setting -> Ve…

Leetcode JAVA刷刷站(1)两数之和

一、题目概述 二、思路方向 为了解决这个问题&#xff0c;你可以使用哈希表&#xff08;在Java中通常使用HashMap&#xff09;来存储遍历过的数组元素及其对应的索引。这样&#xff0c;当你遍历数组时&#xff0c;你可以检查target - 当前元素是否已经在哈希表中&#xff0c;如…

SpringBoot(Ⅰ)——HelloWorld和基本打包部署+Pom依赖概述+@SpringBootApplication注解+自动装配原理

前言 如果SSM学的比较好&#xff0c;那么SpringBoot说白了就两件事:约定大于配置和自动装配 SpringBoot不会提供任何的功能拓展&#xff0c;完全依赖我们手动添加 所以SpringBoot的本质是一个依赖脚手架&#xff0c;可以快速集成配置各种依赖 1.1 SpringBoot相关依赖 创建…

SQL注入---时间盲注

目录 1、时间盲注 1.1原理 2、常见函数 2.1延迟函数 2.2相关函数 3、注入流程 3.1判断注入点 3.2测试可注入方式 3.3猜数据库长度 3.4猜数据库名 4、靶场示例&#xff08;less9&#xff09; 4.1判断注入点 4.2猜测数据库长度 4.3猜数据库名 代码&#xff1a; 结…

OpenGL实现3D游戏编程【连载3】——3D空间模型光照初步

1、本节实现的内容 上一节课&#xff0c;我们建立了简单的坐标系&#xff0c;同时也显示了一个正方体&#xff0c;但正方体的颜色为纯红色&#xff0c;好像一个平面物体一样&#xff0c;我们这节课就可以加一些光照&#xff0c;并创建更多的模型&#xff0c;使这些物体变得更加…

nvm 切换、安装 Node.js 版本

nvm下载路径 往下拉找到Assets 下载后&#xff0c;找到nvm-setup.exe双击&#xff0c;一直无脑下一步&#xff0c;即可安装成功。 配置环境变量&#xff08;我的是window11&#xff09; 打开任务栏设置–搜环境变量 配置好后&#xff0c;点确定一层一层关闭 windowR 打开控制…

学习C语言第23天(程序环境和预处理)

1. 程序的翻译环境和执行环境 在ANSIC的任何一种实现中&#xff0c;存在两个不同的环境 第1种是翻译环境&#xff0c;在这个环境中源代码被转换为可执行的机器指令。 第2种是执行环境&#xff0c;它用于实际执行代码。 2. 详解编译链接 2.1 翻译环境 每个源文件单独经过编…

音视频剪辑库moviepy及其应用

moviepy是一个用于视频编辑的Python库&#xff0c;可以处理视频和音频文件。其常见用途&#xff1a; 视频剪辑和合并&#xff1a;剪辑/将多个视频文件合并成一个视频。 视频转换&#xff1a;将视频转换为不同的格式&#xff0c;比如将MP4文件转换为GIF。 文字和图形叠加&…

arcgis pro批量修改多个矢量的属性

在arcgis pro中&#xff0c;我想批量修改多个矢量的属性值。 比如&#xff1a; 我有两个要素&#xff1a;2021年县级和2022年县级&#xff0c;它们都有“区划码”、“曾用名”、“备注信息”这两个属性。 现在我想使用arcgis pro的脚本功能&#xff0c;使得2021年县级和2022年县…

凯特与戴安娜两位王妃:风采各异 凯特王妃虽未及婆婆影响力但效仿很有成效

最显而易见的也是必须了解的前提:戴安娜王妃是现任凯特王妃已故的婆婆 不过她们是没有见过面的婆媳,戴安娜王妃去世的那年,凯特才15岁!从阶级来看,当时的课题家族应该没有机会见到戴安娜。 凯特还没有像戴安娜一样对世界产生那么多的影响力 在英国王室的璀璨星空中,凯…

AI人工智能为企业带来的优势及应用例子

自2022年知名大型语言模型及其他 AI 产品面世至今&#xff0c;无论商界、政府以至社会各界都逐渐关注人工智能的发展&#xff0c;并纷纷引入 AI 技术&#xff0c;全球正式踏入人工智能的新纪元。根据 Statista 一份有关全球人工智能软件的数据研究&#xff0c;至2025年预测各国…

uni-app中如何使用日期选择器

uni-app中如何使用日期选择器&#xff0c;分别实现日&#xff0c;月&#xff0c;年 日 <picker mode"date" fields"day">是日的内容</picker> 月 <picker mode"date" fields"month">日期选择器</picker> 年…