Vue复习姿势——UI组件开发

320 阅读3分钟

引言

Vue框架在工作中通常用在业务系统上,其中的一些知识很少用到,比如声明式组件,递归型组件等。 所谓用进废退,需要给自己找个最佳的复习姿势,想来想去,选择了UI组件开发这样的方式。

本项目不会涉及到webpack相关知识,更多的关注在Vue的使用上。因此直接使用开源的UI库脚手架来二次开发。毕竟大佬们的脚手架要比自己搭的好太多。

目录结构

采用已有的开源脚手架,掘金文章链接地址为:juejin.cn/post/684490…

// 工程目录
├── src 
|  ├── locale
|  |  ├── lang
|  |  |  ├── zh-CN.js // 语言文件-中文
│  ├── mixins // vue的混入功能
|  |  ├── emittier.js // vue组件通讯相关
|  ├── packages // 存放组件的目录
│  ├── styles 公共样式目录
|  |  ├── common // 公共样式文件
|  |  |  ├── animate.scss // 动画/过渡样式
|  |  |  ├── var.scss // scss环境变量
|  |  ├── font // 字体图标(iconfont字体库下载即可)
|  |  ├── mixins // 样式混入
|  |  ├── index.scss // 样式文件整合
│  ├── utils 工具函数目录
|  |  ├── assist.js // 工具函数
│  └── index.js
├── docs // vuepress相关

以上是大致的一些目录结构,只介绍常用的几个目录
一个组件的创建流程大致是这样的(以Button为例):

  1. packages目录下创建button文件夹,文件夹内新建button.vueindex.js文件。
  2. styles目录下新建button.scss,并在styles/index.scss中引入。
  3. src/index.js中引入新创建的button,即可在vuepress中使用该button组件。

部分内置功能介绍

1. vue通讯-事件派发与事件广播

vue1.x版本内置了$dispatch$broadcast方法,前者向上派发事件,后者向下广播事件。不过在vue2.x版本废弃了,我们可以自行实现这两个方法。
一个vue界面由多个组件构成,这些组件组成一棵组件树,通过组件实例信息,可以轻松找到它的父级,子级,甚至父级的父级,子级的子级等等。沿着这棵树,我们能找到任意一个组件,然后对其进行操作。
$dispatch沿着$parent向上找寻符合条件的组件(通常是用name作为条件),然后执行操作。 $broadcast则是沿着$children向下查找符合条件的组件,然后执行操作。

image.png

// src/mixins/emitter.js
function broadcast(componentName, eventName, params) {
  this.$children.forEach(child => {
    const name = child.$options.name;

    if (name === componentName) {
      child.$emit.apply(child, [eventName].concat(params));
    } else {
      broadcast.apply(child, [componentName, eventName].concat([params]));
    }
  });
}
export default {
  methods: {
    dispatch(componentName, eventName, params) {
      let parent = this.$parent || this.$root;
      let name = parent.$options.name;

      while (parent && (!name || name !== componentName)) {
        parent = parent.$parent;

        if (parent) {
          name = parent.$options.name;
        }
      }
      if (parent) {
        parent.$emit.apply(parent, [eventName].concat(params));
      }
    },
    broadcast(componentName, eventName, params) {
      broadcast.call(this, componentName, eventName, params);
    }
  }
};

2. scss变量

将一些公共的样式抽取成scss变量,比如主题色。这样在实现主题变换的时候只要修改scss变量即可。以下是目前可能用到的一些变量,之后需要时还会添加。

// styles/common/var.scss
// 主题颜色
$--color-primary: #00554a !default;
$--color-text: transparent !default;
$--color-info: #fff !default;
$--color-success: #67c23a !default;
$--color-warning: #e6a23c !default;
$--color-error: #f56c6c !default;

// 尺寸
$--size-large: 40px;
$--size-medium: 36px;
$--size-small: 32px;
$--size-mini: 28px;

// 字体尺寸
$--font-size-large: 16px;
$--font-size-medium: 14px;
$--font-size-small: 13px;
$--font-size-mini: 12px;

// 字体颜色
$--font-color-main: #5e6d82;

// 边框颜色
$--border-color: #dcdfe6;

// 禁用色
$--color-disabled: #c0c4cc;

// 滚动条的样式
@mixin scrollBar {
  &::-webkit-scrollbar-track-piece {
    background: #f8f8f8;
  }

  &::-webkit-scrollbar {
    width: 6px;
    height: 6px;
  }
  &::-webkit-scrollbar-thumb:hover {
    background-color: #bbb;
  }
  &::-webkit-scrollbar-thumb {
    background: #dddddd;
    border-radius: 10px;
  }
}

3. 字体图标

使用iconfont替代使用的图标文件,iconfont属于文本,因此对文本生效的css样式基本上都支持,比如设置颜色。
项目中采用的是iconfont网站提供的font class形式加载图标。具体流程是从iconfont上选择图标加入项目,然后下载到本地,直接替换掉styles/font目录下的文件。

image.png

// styles/index.scss
@import "./font/iconfont.css";

这样就能在组件上使用了,使用方式是<i class="iconfont icon-xxx" />

结语

已有ButtonRadioCheckboxInputInputNumber五个组件。目标是将所有常见的UI组件都写一遍。
这是我第一次分享文章,算是给自己开个大坑,希望不鸽..... 欢迎催更~~

demo地址: oversnail.github.io/over-snail-…
git地址: github.com/overSnail/o…

参考文章

如何打造一套vue组件库
手摸手,带你优雅的使用icon