variant的本意是变体、变种。在计算机里面可以翻译为变体,也就是说同一种物体,有很多种不同的形态,比如说人有黑人、白人、黄种人多种变体,但都是人。这个概念非常重要,因为在UI框架里面,variant的概念无处不在。

1 - Introduction

什么是material ui?就是一个UI组件库。Material UI (现在通常简称为 MUI) 的设计灵感和风格来源于 Google 的 Material Design 规范

image-20251028130245810

课程结构

image-20251028130515969

2 - Getting Started

创建项目npm create vite@latest react-mui-demo

安装依赖npm install @mui/material @emotion/react @emotion/styled@mui/material是核心库,提供组件。@emotion/react@emotion/styled让我们可以在js里面写css。

App.tsx文件改为下面这样,方便后面的学习:

后面每讲到一个component,都会放到App.tsx里面来演示。

mui的文档应该怎么查看:

在components里面可以看到各种组件的用法,但是里面的属性含义是不明的。

image-20251029083205539

在components api里面能够查看组件属性的含义:

image-20251029083443130

所以二者要结合起来看。

3 - Typography

第3-13节是Inputs相关的内容。

typography:排版。

这个组件我之前从来没有用过,也好像没有见过,到底这个是用来干什么的呢?问了一下gemini,它说:

Typography 是一个内容呈现组件,专注于文字本身。在构建应用时,您会大量使用其他 MUI 组件(如 ButtonPaperGrid 等)和普通 HTML 标签(如 <div>),它们负责结构、布局和交互。只有当您直接在这些结构中添加纯文本时,才应该使用 Typography 来包裹。

就是说,当有文字展现的时候,就要考虑使用Typography来包裹住,以保持文字样式的统一,避免写很多样式代码。Typography主要设置了字体大小、字重和line-height。

仔细想一想,还是蛮有用的,我在写vue项目的时候,确实写了很多文字相关的样式,这些样式其实都可以预定义,只不过项目做的很粗糙,自己又不敢做,所以一直就没有做。

这个组件在有要求的项目里面,还是很重要的。

Use typography to present your design and content as clearly and efficiently as possible.

image-20251029090403600

image-20251029090430205

可以看到,Typography所展示的是原始的标签,而不是一些div+css。

老师讲解了一下mui组件的默认主题样式从哪里可以找到,在https://mui.com/material-ui/customization/default-theme/里面可以看到:

image-20251029085504627

4 - Button

老师演示了一下Button的用法。

image-20251029094557076

5 - Button Group

button group的效果是这样的。遇到这种效果要记得使用它。

image-20251029095109493

image-20251029101206834

6 - Toggle Button

toggle button的形式是下面这样的:

image-20251029102715700

而我脑海中出现的toggle button,其实叫做switch。

image-20251029102701723

多选

效果:

单选

需要添加exclusive属性,而且变量值也变为单个值。

效果:

7 - Text Field

基本用法

前缀、后缀文字或图标

需要结合InputAdornment组件一起使用。

errors的用法

这个是在form里面很重要的用法。

 

可以看到,在页面初始化的时候就出现了必填校验报错,这个先不管,这不是mui的范畴。可以使用react hook form来解决表单问题。

8 - Select

实际上mui提供了Select组件,但是老师这里讲解的是使用TextFieldMenuItem来组成Select。

基本用法

多选

需要在TextField上添加属性,才能变为多选:

案例:

9 - Radio Button

Radio组件可以单独使用,也可以组合起来使用。单独使用参考:https://mui.com/material-ui/react-radio-button/#standalone-radio-buttons。给出的是在Form里面的案例。

 

一些属性

 

为什么FormLabel上面要设置id,RadioGroup上面要设置aria-labelledby?

其实这还是无障碍设计的规范问题,而不是功能上的必须。

非常好的问题 👍。 这其实是一个 无障碍(Accessibility / a11y)设计 的规范问题,而不是功能上的必需。


🧩 一句话总结

<FormLabel>id<RadioGroup>aria-labelledby配合使用的 它们让屏幕阅读器(screen readers)知道 这组单选按钮的标题是什么


🧠 详细解释

  1. <FormLabel>

    • 这个标签在视觉上是表单控件的标题,比如显示“Gender”。
    • 设置 id 是为了能被其他元素引用(比如下面的 RadioGroup)。
  2. <RadioGroup>

    • aria-labelledby 是一个 ARIA 属性(Accessible Rich Internet Applications)。

    • 它告诉辅助技术(比如屏幕阅读器):

      “这个 RadioGroup 的标签是由 id="demo-radio-buttons-group-label" 的那个元素定义的。”

    • 也就是说:当屏幕阅读器读到这组单选按钮时,会说出:

      “Gender, group of 3 radio buttons. Female, selected. Male. Other.”


✅ 如果你去掉它们,会怎样?

  • 视觉上完全没问题。
  • 但是对使用屏幕阅读器的人来说,他们不知道这组单选按钮的主题是什么(比如“Gender”)。
  • 这会降低网站的 可访问性(Accessibility)等级

💡 总结对照表

属性用于作用
idFormLabel提供唯一标识
aria-labelledbyRadioGroup引用上面的 id,告诉辅助技术它的标签是谁

🌱 补充小知识

如果你用的是 label="Gender" 这样的方式直接放在 <RadioGroup> 里,视觉上是一样的,但 MUI 官方更推荐使用 FormLabel + aria-labelledby,因为它能同时兼顾:

  • 语义化结构(HTML)
  • 无障碍兼容性(屏幕阅读器)
  • 样式一致性(MUI 样式系统)

更多aria相关的问题,可以查看我专门的一个文档。

10 - Checkbox

基本用法

 

 

纯图标的checkbox

 

checkbox组

这种checkbox的交互方式要记住。

 

一些属性

image-20251029144025730

image-20251029144105494

11 - Switch

12 - Rating

基本使用

在点亮的星星上面再次点击一次,就会取消高亮。

一些属性

还有readOnly只读属性。highlightSelectedOnly属性,可以只将当前选项高亮,这个在rating的图标都不相同的时候,可以使用。

13 - Autocomplete

基本用法

可以看到,里面可以搜索。而且只有选中的选项才会有值,如果是输入的,那么就没有值。这个值可以供校验来判断,或者最后提交的时候来校验判断,要确保用户提交的是正确的数据。

freeSolo属性

在一些情况下,比如说google搜索里面,是给出了搜索建议,但是我还是可以自己输入内容进行搜索,自己输入内容后点击enter键,此时输入的内容也是有效的,就像这样:

想要这种效果,就在Autocomplete组件上加上freeSolo属性。

options值是对象数组,怎么处理

options参数可以直接给对象数组,对象数组必须包含label属性。如果不包含,那么需要设置getOptionLabel属性。

image-20251029160940799

里面的value要进行处理,value的值类型就是对象数组里面对象的类型,其余的没有什么变化。

可以看到,值是一个对象:

14 - Box

第14-27节,是layout相关的内容。

Box类似于div标签,如果没有特殊的语意,都使用Box来包裹其它组件。有特殊语意的组件,比如说 Container, Stack and Paper。Box的适用性更广泛一些。

Box默认渲染成div,但是如果指定component属性,就可以渲染成相应的组件。

image-20251029163942884

为什么不直接使用div、span这些标签呢?因为Box可以设置sx属性,来使用mui定义好的主题样式(当然也可以直接定义样式),如下:

还可以直接在Box组件上设置样式属性:

image-20251029164349508

这里其实我感觉不是很爽,因为我感觉如果使用mui的样式的话,又要学习一套样式系统,我连tailwindcss都还没有搞清楚,学习这个确实很难说服自己。不过应该可以使用tailwind,样式先不用太着急。

15 - Stack

Stack is a container component for arranging elements vertically or horizontally.

重点放在Stack上面,sx用来设置样式,direction可以设置Stack里面元素排列的方向,spacing用来设置里面元素之间的间距,divider设置里面元素之间的分隔样式。

image-20251029165639494

 

 

 

 

##