新手小白 : ElementUI 源码阅读 |
您所在的位置:网站首页 › elementui源码结构 › 新手小白 : ElementUI 源码阅读 |
先介绍一下文件结构
就说主要的几个吧,不影响阅读 examplesexamples文件夹内各xx.md文件经过打包,最终形成 html展示在网页中 packages文件夹内,各个子文件夹分别对应每个组件。内部文件分工,以steps 步骤条为例,介绍一下,其他组件同理。 packages - steps // steps 组件 - src // steps 源码存放 - step.vue // steps 用到的 step 组件的源码 - steps.vue // steps 组件源码 - index.js // 将 steps 作为组件导出的 js 文件 - README.md // readme,介绍用的吧 - theme-chalk // 存放 css -> 各个组件的对应 css 文件 steps 源码 steps.vueprops部分的属性,如下: 刚好对应文档中Steps Attributes部分的属性 观察到space属性在 steps.vue文件中,仅在定义时出现: 在 steps.vue里没有用到?没关系,与步骤条有关的vue文件,除了这个,不还有一个 step.vue。 step.vue : 可以看到, space 最后通过 style.flexBasis = space; 赋值于 flex-basis 属性上。 所以实际上就是通过flex-basis设置步骤条之间的间距。 direction 属性 direction显示方向通过类名 控制步骤条是水平还是垂直的样式: 默认是水平方向: 其实就是当前步骤条进展到哪一步了 当步骤条进度改变的时候,watch就会捕捉到变化,并且触发change事件 step.vue : 在step挂载之时,监听 index 的变化。 可以看到index初始值为-1: 通过VUE 插件调试可得,index代表的是当前step在整个steps中的序号,由0开始。
step.vue 在step.vue文件中,初始化时,将step的VNode虚拟节点的实例push进入steps.vue文件中的steps数组中。 steps.vue 在steps.vue文件中,监听到steps数组的变化,将会触发step.vue文件index变量的变化。 看下图红框内容: 它再次创建了两个监听,一个是对steps.vue文件中active的监听,一个是对processStatus的监听。 且不论processStatus是什么东西,单看监听的回调函数,都有对this.updateStatus()函数的调用。 this.updateStatus()updateStatus(val) { ... } 参数中的 val 即 this.$watch('$parent.active', this.updateStatus,);中传入的 $parent.active 。 prevChild 接收兄弟实例,更准确地说是当前实例的上一个实例,如果当前实例是第一个,则prevChild 值为undefined。 在if中进行判断: val === this.$parent.active , 是 “ 当前激活的步骤 ” this.index 是 “ 当前步骤 ”分别与 “ 当前激活的步骤 ” 互相比较,来赋予 “完成 finish ”、 “当前进行中 process ”、 “等待 wait ”三种状态。 哦,怪不得函数名叫updateStatus,更新状态嘛 再看最后一行if (prevChild),如果当前步骤不是第一个,那么让当前步骤的上一个步骤触发calcProgress函数。同时将当前步骤的状态传进去。 this.calcProgress()可以得知,入参status即当前步骤的下一步骤的状态。 一开始设置了一个step变量,看最后,他被赋值给高度或者宽度。 如果步骤条水平方向,则赋值给宽度,如果是竖直方向,则赋值给高度。 最终style被赋值给this.lineStyle 我们从下图可以看到,Element UI的机制是,当前步骤紧邻的那条线是灰色的。 这个是因为函数calcProgress中这行代码: if (status === this.$parent.processStatus) { step = this.currentStatus !== 'error' ? 0 : 0; }如果当前步骤的下一步骤是process的状态,则将当前步骤的 step 变量设置为0。 就是彩色的那条线没有高度也没有宽度,这样显示出来的就是彩色线下面的灰色线了。 如果想要实现下图的效果: 只需将代码修改为这样即可: if (status === this.$parent.processStatus) { step = this.currentStatus !== 'error' ? 100 : 0; } 另外多一句嘴,如果想要将步骤之间的线修改为 `1px`,只需要区分一下步骤条是垂直方向还是竖直方向,然后修改一下`borderWidth`这个样式即可。 process-status process-status设置当前步骤的状态wait / process / finish / error / success可以人为设置这几个参数到底是什么 finish-status finish-status设置结束步骤的状态wait / process / finish / error / success同process-status align-center align-center进行居中对齐boolean-布尔值 steps.vue step.vue 通过isCenter接收 通过isCenter控制居中样式是否生效 同 align-center 结语内容差不多就是这样。过程中遇到不理解的也不用着急,慢慢看,从函数、变量的命名也能猜出来大概意思,如果现在深究不出来具体实现,可以先过一遍,有大概印象再过一遍。 而且现在源码解读内容很多,多看看也能大概理解一部分。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |