iview源码解析
对iview源码项目的结构和组件进行解析,仅个人学习过程中的记录和理解,不对之处还请不吝赐教
源码
version:3.1.5
地址:https://github.com/iview/iview
项目结构
├─assets 图片存放目录
├─build Webpack配置存放目录
├─dist 打包之后页面存放目录
├─examples 组件的demo页面存放目录
├─node_modules 项目依赖目录
├─src 组件根目录
│ │ index.js 组件入口
│ ├─components 组件存放目录
│ ├─directives 组件封装的指令存放目录
│ ├─locale 组件封装的语言配置存放目录
│ ├─mixins 组件封装的混入存放目录
│ ├─styles 组件的样式根目录
│ │ │ copyright.less
│ │ │ custom.less 样式公共变量
│ │ │ index.less 样式入口
│ │ │ README.md
│ │ │
│ │ ├─animation 动画样式
│ │ │
│ │ ├─color
│ │ │
│ │ ├─common 公共样式
│ │ │
│ │ ├─components 组件样式
│ │ │
│ │ └─mixins 混入样式
│ │
│ └─utils 组件内部公共方法
├─test 测试文件
└─types typeScript文件
组件目录
Let‘s Start
index.js 入口文件
1 | //大致结构 |
使用方法
1 | import iView from '../src/index'; |
Components
Icon 图标组件
所有的icon的样式文件和编码定义都可以在src\styles\common\iconfont 下找到,prefix=ivu-icon-。
组件很简单,用的是原生的 i 标签,绑定了原生的click方法。
1 | <i :class="classes" :style="styles" @click="handleClick"></i> |
1 | handleClick (event) { |
原生事件在使用的时候要添加native修饰符
1 | <Icon @click.native="handleClick"> |
Button 按钮组件
1 | <component :is="tagName" :class="classes" :disabled="disabled" @click="handleClickLink" v-bind="tagProps"> |
最外层用 component 标签是用于如果用到了 to API,按钮点击跳转,则用原生的a标签包裹,否则为button标签
button的类型有下列几种,其中的oneOf方法跳转/util/assist.js文件,用于判断第一个参数是否在第二个数组参数内
1 | type: { |
最外层的标签上绑定了handleClickLink方法,
1 | / Ctrl or CMD and click, open in new window when use `to` |
如果用到to跳转,即最外层是a标签时,使用ctrl和cmd的同时点击跳转,则打开新窗口跳转,handleCheckClick方法通过mixins引入,见/mixin/link,是一个封装的打开新窗口的方法
ButtonGroup 按钮组合
通过设置动态的class来实现按钮组合的效果
Grid 栅格组件
组件内分为行组件row.vue和列组件col.vue,
1 | <div :class="classes" :style="styles"> |
两个组件都类似,使用到了插槽方法,大部分的功能也是用样式实现,这边主要介绍组件中使用的几个方法,/utils/assist中的findComponentUpward,findComponentDownward,findBrothersComponents,从名称也可以看出来,功能是找寻父组件,子组件,兄弟组件。
Layout 布局组件
Layout
:布局容器,其下可嵌套Header`
SiderContent
Footer或
Layout` 本身,可以放在任何父容器中。Header
:顶部布局,自带默认样式,其下可嵌套任何元素,只能放在Layout
中。Sider
:侧边栏,自带默认样式及基本功能,其下可嵌套任何元素,只能放在Layout
中。Content
:内容部分,自带默认样式,其下可嵌套任何元素,只能放在Layout
中。Footer
:底部布局,自带默认样式,其下可嵌套任何元素,只能放在Layout
中。
1 | <div :class="wrapClasses"><slot></slot></div> |
都是使用slot插槽的方法实现,layout.vue中有findSider方法,查询是否有侧边栏,
1 | findSider () { |
some 方法判断是否存在,$children找到子组件
Card 卡片组件
1 | <div :class="classes"> |
总共有3个插槽,自定义标题、额外操作、主题内容,可以完全自由控制各个部分
Collapse 折叠面板
分为单个的面板组件panel.vue和一个放置面板的容器collapse.vue。
面板组件的主题内容也是通过插槽插入,
1 | <collapse-transition> |
CollapseTransition是面板打开关闭的transition动画,
1 | toggle () { |
面板组件里点击title触发父元素的toggle方法,name参数 为操作的面板名称,isActive为开启还是关闭。
1 | toggle (data) { |
父元素的toggle方法,