前言

Angular Material 为了更好的和 Material Design 保持一致, 放弃了自己开发, 改而使用 wrapping MDC 的方式来维护 Angular Material.

Youtube – NG Conf 2019 Day 3 CDK Is The Coolest Thing You Are Not Using With Jeremy Elbourn

这是一件令人沮丧的事情, 因为从来没有一个 framework 能 wrapping MDC 成功. 从来没有,

Angular Team 也不会例外. 从提出到现在已经 3 年了, 依然属于 experimental 的状态.

不是 wrapping 吗? 不是应该很顺利的吗? 都不用实现只是 wrap 而已丫... 显然并不是那么简单的. Material Design 本身就有许多问题, 加上团队人员其实并不熟悉 UI/UX 他们只是会开发而已.

这就导致了更难去实现这些组件. 一旦 Material Design 有修改, 他们需要很多精力才能跟上, 所以整个进度是非常缓慢的.

吐槽归吐槽, 好的 UI 库肯定是收费的, 自己搞一套 Design System 自己做组件也很累啊. 所以即使知道很多问题还是得用, 毕竟也没有多少选择.

为了更好的使用 Angular Material 和用 Material Design 在非 Angular 的项目上, 我开始学习 MDC. 之后会陆陆续续把我有用到组件记入在这个栏目里.

想知道 Angular Material, MDC, MWC, Lit 的关系看这篇.

参考

Github – Material Components for the web

Google Developers Codelabs – MDC-101 WebMDC-102 Web, and MDC-103 Web

Youtube – Material.io Web Components Tutorial

Material Design Component 4 Web 框架推送

Installation

它可以使用 CDN 直接插入 <script> 然后全局调用 window.mdc.

但我的项目都是用打包工具 (Webpack) 的, 所以之后都会以 Webpack 的形式教.

参考: Webpack 学习笔记

MDC 会用到 Scss 和 TypeScript, 所以 Webpack 需要 setup 这些哦.

Start with Material Button

搭建好 Webpack 环境后, 我们来试试看搞一个 material button 出来, 作为最简单的 startup.

首先, MDC 是给那些搞 UI 库的人用的, 所以它只有文档, 没有教程. 调用体验也不会太好.

下面是使用它的步骤:

1. find documentation

github 有所有的 material component 文档 master/packages

找到指定的 mdc-button

2. copy/paste HTML

有点和使用 Bootstrap 类似, 上面文档里面有写好的 HTML

<button class="mdc-button mdc-button--raised">
<span class="mdc-button__ripple"></span>
<span class="mdc-button__focus-ring"></span>
<span class="mdc-button__label">Contained Button</span>
</button>

它的 class 是用 BEM 命名的.

2. install package

yarn add @material/button

每一个组件都是独立的一个 package, 都需要 yarn add. 所以 package.json 会有很长的 list...

3. @use Scss

@use "@material/button/styles";

或者用 CSS Link

<link rel="stylesheet" href="https://unpkg.com/material-components-web@latest/dist/material-components-web.min.css">

这时 button 已经有设计了.

但少了一些交互的体验, 比如 ripple effect, 因为 ripple 需要依赖 JavaScript. 所以除了 import Scss, 也需要 import TypeScript

4. import TypeScript

import { MDCRipple } from '@material/ripple';
new MDCRipple(document.querySelector('.mdc-button')!);

所有的 TS 调用手法都类似, import 一个 class, 然后实例化这个 class 传入想 setup 的 element.

它会返回一个 instance, 如果想做后续的 config 或者监听可以在 instance 上面做. 和使用 jQuery 的方式很像, 只不过它是以实例化 class 的方式开始.

这时就有 ripple 效果了.

Auto Init & Get Instance from Element

参考: Docs – Auto Init

Auto init 主要是方便 setup TypeScript 的部分.

在 HTML 添加 data-mdc-auto-init, 值可以是任何一个 string 名字

<button class="mdc-button mdc-button--raised" data-mdc-auto-init="MDCRipple">

然后在 TypeScript 使用

import mdcAutoInit from '@material/auto-init'; // import init method
import { MDCRipple } from '@material/ripple'; // import class mdcAutoInit.register('MDCRipple', MDCRipple); // register mapping
// can listen on init done
document.addEventListener('MDCAutoInit:End', () => {
console.log('done init');
});
mdcAutoInit(document); // run the binding

搞一个 mapping, 最后调用 mdcAutoInit, 它会去 query document 找出所有的 data-mdc-auto-init

然后通过 mapping 找到对应的 class 去实例化.

要获取 instance 的话, 需要从 element 属性里拿出来, 不是很优雅

const instance = document.querySelector<Element & { MDCRipple: MDCRipple }>(
'.mdc-button'
)!.MDCRipple;

p.s. 只有用 init 方式才能从 element 获取 instance 哦,

这种模式通常时用在 rich text editor 的情况. 比如让用户通过 editor 做 Landing Page 设计.

MDC – Get Started的更多相关文章

  1. slf4j中的MDC

    slf4j中MDC是什么鬼 slf4j除了trace.debug.info.warn.error这几个日志接口外,还可以配合MDC将数据写入日志.换句话说MDC也是用来记录日志的,但它的使用方式与使用 ...

  2. zlog学习笔记(mdc)

    mdc.h #ifndef __zlog_mdc_h #define __zlog_mdc_h #include "zc_defs.h" typedef struct zlog_m ...

  3. LogBack sl4j 通过MDC实现日志记录区分用户Session[以Spring mvc为例]

    1.首先实现一个interceptor,在请求开始的时候MDC put一个Session标志,interceptor结束的时候remove掉   import javax.servlet.http.H ...

  4. log4j之NDC、MDC

     NDC 介绍 NDC(Nested Diagnostic Context)是 Neil Harrison 在名为<Patterns for Logging Diagnostic Message ...

  5. log4j中的MDC和NDC

    NDC和MDC NDC(Nested Diagnostic Context)和MDC(Mapped Diagnostic Context)是log4j种非常有用的两个类,它们用于存储应用程序的上下文信 ...

  6. MDIO/MDC(SMI)接口

    转载:http://blog.chinaunix.net/uid-24148050-id-132863.html 1. 简介 The MDIO interface is a simple, two-w ...

  7. SMI接口,SMI帧结构,MDC/MDIO

    转载:http://blog.csdn.net/zyboy2000/article/details/7442464 SMI全称是串行管理接口(Serial Management Interface). ...

  8. log4j2配置MDC分线程写日志

    1.MDC是一个高级一些的工具,可以配置分用户(userid)写日志,也可以分线程 2.方法和道理都是相似的,在写入日志之前配置线程名或者用户id 3.如果将线程名配置为目录,可以将不同线程的日志输送 ...

  9. Log4j NDC MDC

    NDC(Nested Diagnostic Context)和MDC(Mapped Diagnostic Context)是log4j种非常有用的两个类,它们用于存储应用程序的上下文信息(contex ...

  10. logback输出json格式日志(包括mdc)发送到kafka

    1,pom.xml <!-- kafka --> <dependency> <groupId>com.github.danielwegener</groupI ...

随机推荐

  1. PowerBuilder现代编程方法X01:PowerPlume的X模式

    临渊羡鱼,不如退而结网. PB现代编程方法X01:PowerPlume的X模式 前言 PowerPlume是PowerBuilder深度创新的扩展开发框架(免费商用). 它不是一个大而全的类库(取决于 ...

  2. 二分专题总结 -ZHAOSANG

    上一周训练了二分专题 可能是我之前自学的时候基础没有打牢,做的时候还是吃力的. 现总结遇到的一些二分题型和思路 二分+模拟(题目最多的) [https://ac.nowcoder.com/acm/co ...

  3. 我用Awesome-Graphs看论文:解读Pregel

    Pregel论文:<Pregel: A System for Large-Scale Graph Processing> 上次向大家分享了论文图谱项目Awesome-Graphs的介绍文章 ...

  4. .Net内存管理释放的两种方式

    在.Net中,资源回收主要是指内存管理和非托管资源的释放.分别提供了两种主要的方式进行处理: 垃圾回收(GC) 确认性资源释放(DRD) 官网相关文档的链接:https://learn.microso ...

  5. SmolLM: 一个超快速、超高性能的小模型集合

    简介 本文将介绍 SmolLM.它集合了一系列最尖端的 135M.360M.1.7B 参数量的小模型,这些模型均在一个全新的高质量数据集上训练.本文将介绍数据整理.模型评测.使用方法等相关过程. 引言 ...

  6. 中国AI领域超越美国的拐点在哪 —— 国产AI芯片量产化的成本接近于美国成熟AI芯片的成本

    作为AI领域的一个大头兵,本是没有资格去谈论high level层面的东西的,只不过总有些忍不得说的事情. 今天这里就说下个人对中国AI发展的一个观点或是预测,在我看来中国AI领域超越美国的拐点就在于 ...

  7. 基于Unity开发的强化学习环境(游戏环境):ml-agents —— Unity ML-Agents

    介绍: https://medium.com/nerd-for-tech/an-introduction-to-machine-learning-with-unity-ml-agents-af7193 ...

  8. 内存交换空间--Swap Space

    转载请注明出处: 一.概述 内存交换空间(Swap Space)是计算机内存的一种补充,位于硬盘驱动器上.当物理内存(RAM)不足时,系统会将不活跃的页面(或称为内存页)移到交换空间中,以释放物理内存 ...

  9. 亚信科技基于 Apache SeaTunnel 的二次开发应用实践

    亚信科技在Apache SeaTunnel的实践分享 自我介绍 各位同学好,很荣幸通过Apache SeaTunnel社区和大家进行分享交流.我是来自亚信科技的潘志宏,主要负责公司内部数据中台产品的开 ...

  10. Flutter&Dart Callback转同步

    前言 怎么将一个Callback回调转化成Future同步方法(Callback to Future),可以配套async / await去使用呢? 个人觉得,这是一个很常见的现象,不知道为啥,很多人 ...