概述

公司技术栈开始用vue主导开发,但因为公司前端会vue的不多所以在项目中用到vue的技术不是很深,之前出去面试被接连打击,而且本来打算开始为公司vue的项目构建自己的组件库所以去下载了iview

源码

打算研究一番,学习大神的组件封装模式和vue的深层技术的运用,随便写博客系列来记录下自己的心得,因为是个人总结所以可能在认识会有点局限也欢迎各路大神一起讨论学习。

iview目录结构

1.assets—图片存放目录

2.build—Webpack配置存放目录

3.dist—打包之后页面存放目录

4.examples—组件的demo页面存放目录

5.src—组件根目录

6.components—组件存放目录

7.directives—组件封装的指令存放目录

8.locale—组件封装的语言配置存放目录

9.mixins—组件封装的混入存放目录

10.styles—组件的样式根目录

11.animation—动画样式

12.common—公共样式

13.components—组件样式

14.mixins—混入样式

15.custom.less—样式公共变量

16.index.less—样式入口

17.utils—组件内部公共方法

18.index.js—组件入口

源码解析

index.js 入口

  1. /**
  2. * 配置语言、加载组件
  3. * @param {Object} Vue
  4. * @param {Object} opts
  5. */
  6. const install = function(Vue, opts = {}) {
  7. if (install.installed) return;
  8. locale.use(opts.locale);
  9. locale.i18n(opts.i18n);
  10. Object.keys(iview).forEach(key => {
  11. Vue.component(key, iview[key]);
  12. });
  13. Vue.prototype.$Loading = LoadingBar;
  14. Vue.prototype.$Message = Message;
  15. Vue.prototype.$Modal = Modal;
  16. Vue.prototype.$Notice = Notice;
  17. Vue.prototype.$Spin = Spin;
  18. };
  19. /**
  20. * 在浏览器环境下默认加载组件
  21. */
  22. // auto install
  23. if (typeof window !== 'undefined' && window.Vue) {
  24. install(window.Vue);
  25. }
  26. /**
  27. * 组件vue.user的对象
  28. */
  29. const API = {
  30. version: process.env.VERSION, // eslint-disable-line no-undef
  31. locale: locale.use,
  32. i18n: locale.i18n,
  33. install,
  34. Circle,
  35. Switch,
  36. ...components
  37. };
  38. API.lang = (code) => {
  39. const langObject = window['iview/locale'].default;
  40. if (code === langObject.i.locale) locale.use(langObject);
  41. else console.log(`The ${code} language pack is not loaded.`); // eslint-disable-line no-console
  42. };
  43. /**
  44. * 输出对象
  45. */
  46. module.exports.default = module.exports = API; // eslint-disable-line no-undef

在 examples 文件中的 main.js 中加载 iview 组件

知识点:use

vue 的 use 源码:

  1. import { toArray } from '../util/index'
  2. export function initUse (Vue: GlobalAPI) {
  3. /**
  4. * 判断参数fn是fn的话直接运行fn,是对象的话运行对象里的install方法
  5. * @param {Function|Object} plugin 下面参数类型限制是typescript的写法
  6. * @returns Vue
  7. */
  8. Vue.use = function (plugin: Function | Object) {
  9. // 判断该方法或对象是否已经注册过
  10. const installedPlugins = (this._installedPlugins || (this._installedPlugins = []))
  11. if (installedPlugins.indexOf(plugin) > -1) {
  12. return this
  13. }
  14. // 将参数转化为数组
  15. const args = toArray(arguments, 1)
  16. // 把vue对象插到数组第一个
  17. args.unshift(this)
  18. // 判断plugin对象的install是否是方法
  19. if (typeof plugin.install === 'function') {
  20. // 将plugin对象的install执行并且this指向plugin
  21. plugin.install.apply(plugin, args)
  22. // 如果plugin是方法
  23. } else if (typeof plugin === 'function') {
  24. // 执行plugin方法this指向null
  25. plugin.apply(null, args)
  26. }
  27. installedPlugins.push(plugin)
  28. return this
  29. }
  30. }

看源码我们可以知道在我们以后编写插件的时候可以有两种方式。

一种是将这个插件的逻辑封装成一个对象最后将最后在 install 编写业务代码暴露给 Vue 对象。这样做的好处是可以添加任意参数在这个对象上方便将 install 函数封装得更加精简,可拓展性也比较高。

还有一种则是将所有逻辑都编写成一个函数暴露给 Vue。

其实两种方法原理都一样,无非第二种就是将这个插件直接当成 install 函数来处理。

button组件

button的功能不是很多,主要是样式,所以学习 button 组件大部分时间是看样式。vue 组件在目录:



组件样式目录:





组件样式混入目录:

在分析样式之前我们先去官网上看 iview 按钮组件的大概分了哪种模式和按钮交互上的一些细节。大类上按钮分为单个按钮和按钮组两类。

单个按钮

1).字体居中不换行。

2).默认按钮、幽灵按键 hover 边框颜色和字体颜色改变,过渡效果,主按键 hover 背景颜色变浅20%。

3).所有按键 active 加阴影,阴影颜色和背景色相同,过渡效果。

1.默认按钮、主按键、幽灵按钮、虚线按钮、文字按钮(因为这些种类的按钮在实际用到比较多的是主按键和幽灵按键,所以在自己模拟组件的主要实现了这两张按键)按钮的交互效果:



2.图标按钮



3.按钮组合



更细的分类可以看 iview官网api

iview源码解析(1)的更多相关文章

  1. vue UI库iview源码解析(2)

    上篇问题 在上篇<iview源码解析(1)>中的index.js 入口文件的源码中有一段代码有点疑惑: /** * 在浏览器环境下默认加载组件 */ // auto install if ...

  2. elementUi源码解析(1)--项目结构篇

    因为在忙其他事情好久没有更新iview的源码,也是因为后面的一些组件有点复杂在考虑用什么方式把复杂的功能逻辑简单的展示出来,还没想到方法,突然想到element的组件基本也差不多,内部功能的逻辑也差不 ...

  3. 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新

    本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...

  4. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  5. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

  6. 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例

    前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...

  7. jQuery2.x源码解析(缓存篇)

    jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 缓存是jQuery中的又一核心设计,jQuery ...

  8. Spring IoC源码解析——Bean的创建和初始化

    Spring介绍 Spring(http://spring.io/)是一个轻量级的Java 开发框架,同时也是轻量级的IoC和AOP的容器框架,主要是针对JavaBean的生命周期进行管理的轻量级容器 ...

  9. jQuery2.x源码解析(构建篇)

    jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 笔者阅读了园友艾伦 Aaron的系列博客< ...

随机推荐

  1. 软考之路--从生活着手,看PV如何操作

    PV操作,是软考当中一个很重要的考点,一听到这个名词,顿时赶脚高大上有么有,在软考的历年试题中,也不乏PV操作的身影,老师也对PV操作进行了一次讲课,那时年少,听得稀里糊涂,也不是很理解,在小编的理解 ...

  2. 【翻译】Sencha Cmd中脚本压缩方法之比较

    概述 为什么要修改默认设置 YUI压缩 Google Closure编译器 UglifyJS 案例研究Ext JS 6示例应用程序 注意事项 自定义JS压缩 小结 概述 这么多年来,Web开发人员都被 ...

  3. CollapsingToolbarLayout使用

    我们来看一下CollapsingToolbarLayout的使用场景. CollapsingToolbarLayout 可以看到,Toolbar的标题放大并在下方显示,当我们向上滑动列表时,顶部Hea ...

  4. 解决bootstrap row span设置border换行的问题

    Hadoop方面的毕业设计告一段落了,趁这几天空闲时间认真学习一下之前常使用但是却没用好的Bootstrap. 本文记录Bootstrap框架使用栅格系统时,遇到row内的span设置border换行 ...

  5. (NO.00001)iOS游戏SpeedBoy Lite成形记(十四)

    下面要启用场景的触摸功能,在GameScene.m的didLoadFromCCB方法里添加下面一行: self.userInteractionEnabled = YES; 然后还需要给GameScen ...

  6. CSDN_投票评选_JS_分析脚本

    作者: 铁锚 日期: 2013年12月31日 如题, 使用说明如下: 1. 原创图书 http://special.csdn.net/book2013/yc.html 2. 引进图书 http://s ...

  7. R基础学习

    R基础学习 The Art of R Programming 1.seq 产生等差数列:seq(from,to,by) seq(from,to,length) for(i in 1:length(x) ...

  8. Swift基础之UIButton

    //设置全局变量,将下面的替换即可    //var myButton = UIButton();    //系统生成的viewDidLoad()方法    override func viewDid ...

  9. 【一天一道LeetCode】#38. Count and Say

    一天一道LeetCode系列 (一)题目 The count-and-say sequence is the sequence of integers beginning as follows: 1, ...

  10. 《java入门第一季》之面向对象面试题(继承中构造方法的关系)

    /* 继承中构造方法的关系 A:子类中所有(子类的有参和无参)的构造方法(默认都会访问父类)中(空参数)的构造方法,默认访问父类空参数构造,不默认访问有参数构造 B:为什么呢? 因为子类会继承父类中的 ...