app-preset-button.vue 3.7 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
<template>
    <i-button 
        :class="className"
        :type="buttonType"
        :disabled="disabled"
        :title="tooltip"
        :loading="loading"
        :ghost="buttonGhost"
        @click="handleClick">
        <div :class="['button-content', iconAlign.toLowerCase()]">
            <span v-if="cssClass || imagePath" class="icon">
                <i v-if="cssClass" :class="cssClass" />
                <img v-else :src="imagePath" />
            </span>
            <span v-if="showCaption" class="caption">{{ caption }}</span>
        </div>
    </i-button>
</template>

<script lang="ts">
import { Vue, Component, Prop } from 'vue-property-decorator';

@Component({})
export default class AppPresetButton extends Vue {
    /**
     * 按钮name
     *
     * @type {any}
     * @memberof AppPresetButton
     */
    @Prop() public name!: string;

    /**
     * 显示提示
     *
     * @memberof AppPresetButton
     */
    @Prop() public tooltip?: string;

    /**
     * 标题
     *
     * @memberof AppPresetButton
     */
    @Prop() public caption?: string;

    /**
     * 显示标题
     *
     * @memberof AppPresetButton
     */
    @Prop({ default: true }) public showCaption!: boolean;

    /**
     * 禁用状态
     *
     * @memberof AppPresetButton
     */
    @Prop({ default: false }) public disabled?: boolean;

    /**
     * 加载状态
     *
     * @memberof AppPresetButton
     */
    @Prop({ default: false }) public loading?: boolean;

    /**
     * 传入数据
     *
     * @memberof AppPresetButton
     */
    @Prop() public data: any;

    /**
     * 图标
     *
     * @memberof AppPresetButton
     */
    @Prop() public cssClass?: string;

    /**
     * 图片路径
     *
     * @memberof AppPresetButton
     */
    @Prop() public imagePath?: string;

    /**
     * 按钮绘制模式
     *
     * @memberof AppPresetButton
     */
    @Prop({ default: 'BUTTON' }) public renderMode!: 'BUTTON' | 'LINK';

    /**
     * 按钮样式
     *
     * @memberof AppPresetButton
     */
    @Prop({ default: 'DEFAULT' }) public buttonStyle!: 'DEFAULT' | 'INVERSE' | 'PRIMARY' | 'INFO' | 'SUCCESS' | 'WARNING' | 'DANGER' | 'STYLE2' | 'STYLE3' | 'STYLE4';

    /**
     * 按钮图标方向
     *
     * @memberof AppPresetButton
     */
    @Prop({ default: 'LEFT' }) public iconAlign!: 'LEFT' | 'TOP' | 'RIGHT' | 'BOTTOM';

    /**
     * 按钮类型
     *
     * @memberof AppPresetButton
     */
    get buttonType() {
        if (Object.is(this.renderMode, 'LINK')) {
            return 'text';
        } else {
            if (
                Object.is(this.buttonStyle, 'DEFAULT') ||
                Object.is(this.buttonStyle, 'STYLE2') ||
                Object.is(this.buttonStyle, 'STYLE3') ||
                Object.is(this.buttonStyle, 'STYLE4')
            ) {
                return 'default';
            } else if (Object.is(this.buttonStyle, 'DANGER')) {
                return 'error';
            } else if (Object.is(this.buttonStyle, 'INVERSE')) {
                return 'primary';
            } else {
                return this.buttonStyle.toLowerCase();
            }
        }
    }

    /**
     * 按钮幽灵属性,使按钮背景透明
     *
     * @memberof AppPresetButton
     */
    get buttonGhost() {
        return Object.is(this.buttonStyle, 'INVERSE');
    }

    /**
     * 类名
     *
     * @memberof AppPresetButton
     */
    get className(): string {
        return `app-preset-button ${this.name}`;
    }

    /**
     * 点击按钮
     *
     * @param {*} event
     * @memberof AppPresetButton
     */
    public handleClick(event: any) {
        this.$emit('itemClick', this.name);
    }
}
</script>
<style lang='less'>
@import './app-preset-button.less';
</style>