Steps步骤条组件源码:

steps.vue

<template>
<!--设置 simple 可应用简洁风格,该条件下 align-center / description / direction / space 都将失效。-->
<div
class="el-steps"
:class="[
!simple && 'el-steps--' + direction,
simple && 'el-steps--simple'
]">
<slot></slot>
</div>
</template> <script>
import Migrating from 'element-ui/src/mixins/migrating'; export default {
name: 'ElSteps', mixins: [Migrating], props: {
space: [Number, String], //每个 step 的间距,不填写将自适应间距。支持百分比。
active: Number, //设置当前激活步骤
direction: { //显示方向
type: String,
default: 'horizontal'
},
alignCenter: Boolean, //进行居中对齐
simple: Boolean, // 是否应用简洁风格
finishStatus: { //设置结束步骤的状态
type: String,
default: 'finish'
},
processStatus: { //设置当前步骤的状态
type: String,
default: 'process'
}
}, data() {
return {
steps: [], //记录步骤数数组
stepOffset: 0
};
}, methods: {
// 属性迁移
getMigratingConfig() {
return {
props: {
'center': 'center is removed.'
}
};
}
}, watch: {
active(newVal, oldVal) {
// 当前激活步骤改变时,触发父组件的change方法,将改变前和改变后的步骤作为参数传递出去
this.$emit('change', newVal, oldVal);
}, steps(steps) {
steps.forEach((child, index) => {
child.index = index;
});
}
}
};
</script>

step.vue

<template>
<!--每一步骤的最外层包裹div-->
<div
class="el-step"
:style="style"
:class="[
!isSimple && `is-${$parent.direction}`,
isSimple && 'is-simple',
isLast && !space && !isCenter && 'is-flex',
isCenter && !isVertical && !isSimple && 'is-center'
]">
<!-- 步骤的数字图标和步骤条直线 -->
<div class="el-step__head" :class="`is-${currentStatus}`">
<!--步骤条直线-->
<!--如果是最后一步,margin-right不存在;如果不是,则为0-->
<div class="el-step__line" :style="isLast ? '' : { marginRight: $parent.stepOffset + 'px' }">
<i class="el-step__line-inner" :style="lineStyle"></i>
</div>
<!--步骤条的数字图标-->
<div class="el-step__icon" :class="`is-${icon ? 'icon' : 'text'}`">
<!--如果当前状态为:wait、process、finish-->
<slot v-if="currentStatus !== 'success' && currentStatus !== 'error'" name="icon">
<!--如果是图标则显示对应的图标-->
<i v-if="icon" class="el-step__icon-inner" :class="[icon]"></i>
<!--如果图标和未设置isSimple简洁风格时,则显示步骤文字-->
<div class="el-step__icon-inner" v-if="!icon && !isSimple">{{ index + 1 }}</div>
</slot>
<!--如果当前状态为:success、error-->
<i v-else :class="['el-icon-' + (currentStatus === 'success' ? 'check' : 'close')]" class="el-step__icon-inner is-status"></i>
</div>
</div>
<!-- 步骤条下面每一步的标题和描述 -->
<div class="el-step__main">
<!--每一步的标题-->
<div class="el-step__title" ref="title" :class="['is-' + currentStatus]">
<slot name="title">{{ title }}</slot>
</div>
<!--简洁模式下会有>图标-->
<div v-if="isSimple" class="el-step__arrow"></div>
<!--每一步的描述-->
<div v-else class="el-step__description" :class="['is-' + currentStatus]">
<slot name="description">{{ description }}</slot>
</div>
</div>
</div>
</template> <script>
export default {
name: 'ElStep', props: {
title: String, //标题
icon: String, //图标
description: String, //描述性文字
status: String //设置当前步骤的状态,不设置则根据 steps 确定状态。 wait(灰色)/ process(黑色)/ finish(蓝色)/ error / success(绿色)
}, data() {
return {
index: -1,
lineStyle: {}, //步骤条直线的样式
internalStatus: ''
};
}, beforeCreate() {
this.$parent.steps.push(this);
},
mounted() {
const unwatch = this.$watch('index', val => {
this.$watch('$parent.active', this.updateStatus, { immediate: true });
unwatch();
});
},
beforeDestroy() {
const steps = this.$parent.steps;
const index = steps.indexOf(this);
if (index >= 0) {
steps.splice(index, 1);
}
}, computed: {
// 返回当前步骤的状态
currentStatus() {
return this.status || this.internalStatus;
},
prevStatus() {
const prevStep = this.$parent.steps[this.index - 1];
return prevStep ? prevStep.currentStatus : 'wait';
},
// 返回是否是居中对齐
isCenter() {
return this.$parent.alignCenter;
},
// 返回显示的方向:竖直(false)或者水平(true)
isVertical() {
return this.$parent.direction === 'vertical';
},
// 返回是否应用简洁风格
isSimple() {
return this.$parent.simple;
},
// 判断当前是不是最后步骤
isLast() {
const parent = this.$parent;
return parent.steps[parent.steps.length - 1] === this;
},
// 返回总步骤数
stepsCount() {
return this.$parent.steps.length;
},
// 返回每个step的间距。
space() {
const { isSimple, $parent: { space } } = this;
// isSimple为true时,space将失效
return isSimple ? '' : space ;
},
style: function() {
const style = {};
const parent = this.$parent;
const len = parent.steps.length; //总步骤
// 每个step的间距
const space = (typeof this.space === 'number' //如果设置的space是number
? this.space + 'px' //space等于设置的space
: this.space ? this.space : 100 / (len - (this.isCenter ? 0 : 1)) + '%'); //如果未设置space,未设置居中,则等于100除以(总步骤数-1);设置居中显示,则等于00除以总步骤数。
// flex-basis 属性用于设置或检索弹性盒伸缩基准值。
style.flexBasis = space;
//如果是水平方向则直接返回设置的样式
if (this.isVertical) return style;
//如果是最后的步骤,设置最大宽度等于(100/总步骤数)%
if (this.isLast) {
style.maxWidth = 100 / this.stepsCount + '%';
} else {
//如果不是最后的步骤,marginRight为0
style.marginRight = -this.$parent.stepOffset + 'px';
}
return style;
}
}, methods: {
updateStatus(val) {
const prevChild = this.$parent.$children[this.index - 1];
if (val > this.index) { //如果是下一步
// internalStatus 等于用户设置的结束步骤状态
this.internalStatus = this.$parent.finishStatus;
} else if (val === this.index && this.prevStatus !== 'error') {
// internalStatus 等于用户设置的当前步骤状态
this.internalStatus = this.$parent.processStatus;
} else {
this.internalStatus = 'wait';
}
if (prevChild) prevChild.calcProgress(this.internalStatus);
},
//设置步骤间直线的样式
calcProgress(status) {
let step = 100;
const style = {};
// transitionDelay在过渡效果开始前等待的秒数:
style.transitionDelay = 150 * this.index + 'ms';
if (status === this.$parent.processStatus) {
step = this.currentStatus !== 'error' ? 0 : 0;
} else if (status === 'wait') {
step = 0;
//为负数的时候过渡的动作会从该时间点开始显示,之前的动作被截断;为正数的时候过渡的动作会延迟触发。
style.transitionDelay = (-150 * this.index) + 'ms';
} style.borderWidth = step ? '1px' : 0;
this.$parent.direction === 'vertical'
? style.height = step + '%'
: style.width = step + '%'; this.lineStyle = style; }
} };
</script>

element-ui Steps步骤条组件源码分析整理笔记(九)的更多相关文章

  1. element-ui 组件源码分析整理笔记目录

    element-ui button组件 radio组件源码分析整理笔记(一) element-ui switch组件源码分析整理笔记(二) element-ui inputNumber.Card .B ...

  2. element-ui button组件 radio组件源码分析整理笔记(一)

    Button组件 button.vue <template> <button class="el-button" @click="handleClick ...

  3. element-ui input组件源码分析整理笔记(六)

    input 输入框组件 源码: <template> <div :class="[ type === 'textarea' ? 'el-textarea' : 'el-in ...

  4. element-ui Message组件源码分析整理笔记(八)

    Message组件源码: main.js import Vue from 'vue'; import Main from './main.vue'; import { PopupManager } f ...

  5. element-ui Rate组件源码分析整理笔记(十三)

    Rate组件源码比较简单,有添加部分注释 main.vue <template> <!--valuenow当前的评分 valuetext当前显示的文本--> <div c ...

  6. element-ui MessageBox组件源码分析整理笔记(十二)

    MessageBox组件源码,有添加部分注释 main.vue <template> <transition name="msgbox-fade"> < ...

  7. element-ui inputNumber、Card 、Breadcrumb组件源码分析整理笔记(三)

    inputNumber组件 <template> <!--@dragstart.prevent禁止input中数字的拖动--> <div @dragstart.preve ...

  8. element-ui Pagination组件源码分析整理笔记(七)

    element-ui源码的版本是2.4.9 pagination.js import Pager from './pager.vue'; import ElSelect from 'element-u ...

  9. element-ui Upload 上传组件源码分析整理笔记(十四)

    简单写了部分注释,upload-dragger.vue(拖拽上传时显示此组件).upload-list.vue(已上传文件列表)源码暂未添加多少注释,等有空再补充,先记下来... index.vue ...

随机推荐

  1. windows 系统安装git的方法

    windows 系统安装git的方法 msysgit是Windows版的Git,从https://git-for-windows.github.io下载 安装默认步骤,一步步安装即可 安装完成后,在开 ...

  2. Python标准库 -- UUID模块(生成唯一标识)

    UUID是什么: UUID: 通用唯一标识符 ( Universally Unique Identifier ),对于所有的UUID它可以保证在空间和时间上的唯一性,也称为GUID,全称为: UUID ...

  3. 继承extends、super、this、方法重写overiding、final、代码块_DAY08

    1:Math类的随机数(掌握) 类名调用静态方法.  包:java.lang 类:Math 方法:public static double random(): Java.lang包下的类是不用导包就可 ...

  4. Selenium自动化测试Python二:WebDriver基础

    WebDriver基础 欢迎阅读WebDriver基础讲义.本篇讲义将会重点介绍Selenium WebDriver的环境搭建和基本使用方法. WebDriver环境搭建 Selenium WebDr ...

  5. PLSQL Developer概念学习系列之登录连接Oracle时出现(没有登录) -PL / SQL Developer:ORA - 12541: TNS :无建听程序的错误解决办法(图文详解)

    不多说,直接上干货! 前期博客 PLSQL Developer概念学习系列之如何正确登录连接上Oracle(图文详解)   如用scott.scott_password进行登录,orcl是全局数据库 ...

  6. tabs高度自适应方法

    1.去掉easyui-tabs类属性,改为id=tabs 2.用js控制高度

  7. JavaScript基础(一)概述

    JavaScript 概述 JS作用 验证表单(以前的网速慢) 页面特效(PC端的网页效果) 移动端(移动web和app) 异步和服务器交互(AJAX) 服务端开发(nodejs) 语言类型 js是一 ...

  8. lucene 初探 - 查询

    lucene初探, 是为了后面solr做准备的. 如果跳过lucene, 直接去看solr, 估计有点懵. 由于时间的关系, lucene查询方法也有多个, 所以单独出来. 一. 精确查询 /** * ...

  9. Spring AOP介绍及源码分析

    转自:http://www.uml.org.cn/j2ee/201301102.asp 软件开发经历了从汇编语言到高级语言和从过程化编程到面向对象编程:前者是为了提高开发效率,而后者则使用了归纳法,把 ...

  10. 【LeetCode题解】232_用栈实现队列(Implement-Queue-using-Stacks)

    目录 描述 解法一:在一个栈中维持所有元素的出队顺序 思路 入队(push) 出队(pop) 查看队首(peek) 是否为空(empty) Java 实现 Python 实现 解法二:一个栈入,一个栈 ...