elementUI 组件解读 button Posted on 2018-04-24 | In vue 源码<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>