elementUI 组件解读 button

源码

<template>

// 根据type不同引入不同的class
<button
class="el-button"
@click="handleClick"
:disabled="buttonDisabled || loading"
:autofocus="autofocus"
:type="nativeType"
:class="[
type ? 'el-button--' + type : '',
buttonSize ? 'el-button--' + buttonSize : '',
{
'is-disabled': buttonDisabled,
'is-loading': loading,
'is-plain': plain,
'is-round': round,
'is-circle': circle
}
]"
>
// loading属性显示
<i class="el-icon-loading" v-if="loading"></i>
// 提供了icon属性并且非loading的时候显示 icon
<i :class="icon" v-if="icon && !loading"></i>
// 如果有slot就嵌入显示
<span v-if="$slots.default"><slot></slot></span>
</button>
</template>
<script>
export default {
name: 'ElButton',
// 这个注入是他的父级以上的组件传递进来的, inject和provide是一对,类似react的context的传递能力
// 这里应该是当button组件被Form组件或者FormItem组件包裹的时候会传特定的值进来
inject: {
elForm: {
default: ''
},
elFormItem: {
default: ''
}
},
// 属性类型验证,很好的最佳时间
props: {
type: {
type: String,
default: 'default'
},
size: String,
icon: {
type: String,
default: ''
},
nativeType: {
type: String,
default: 'button'
},
loading: Boolean,
disabled: Boolean,
plain: Boolean,
autofocus: Boolean,
round: Boolean,
circle: Boolean
},
computed: {
// _xxx一般是内部使用,这里看不出干什么用,估计要看到FormItem/Form的时候才能理解
_elFormItemSize() {
return (this.elFormItem || {}).elFormItemSize;
},
// 尺寸 来自不同的地方的属性传递,依次作为fallback
buttonSize() {
return this.size || this._elFormItemSize || (this.$ELEMENT || {}).size;
},
// form disable的时候button也会跟着disable
buttonDisabled() {
return this.disabled || (this.elForm || {}).disabled;
}
},
methods: {
handleClick(evt) {
// 点击事件直接向外传递
this.$emit('click', evt);
}
}
};
</script>