index.vue 2.41 KB
Newer Older
dragondean@qq.com's avatar
dragondean@qq.com committed
1
<template>
2 3 4 5 6 7 8 9 10 11 12 13
    <div class="dict-selector">
        <el-select v-if="formType == 'select'" v-model="valueSync" :placeholder="placeholder" clearable :multiple="multiple">
            <el-option v-for="dict in dictList"
                        :key="dict.value" :label="dict.label" :value="dict.value"/>
        </el-select>
        <el-radio-group  v-if="formType == 'radio'" v-model="valueSync">
            <el-radio v-for="dict in dictList" :label="dict.value" :key="dict.value">{{dict.label}}</el-radio>
        </el-radio-group>
        <el-checkbox-group  v-if="formType == 'checkbox'" v-model="valueSync">
            <el-checkbox v-for="dict in dictList" :label="dict.value" :key="dict.value">{{dict.label}}</el-checkbox>
        </el-checkbox-group>
    </div>
dragondean@qq.com's avatar
dragondean@qq.com committed
14 15 16 17 18 19 20 21 22 23 24
</template>
<script>
export default {
    props:{
        placeholder: {
            type: String,
            default: '请选择'
        },
        type: String,
        value: [String, Number, Array],
        multiple: Boolean,
25 26 27 28
        formType:{
            type: String,
            default: 'select'
        },
dragondean@qq.com's avatar
dragondean@qq.com committed
29 30 31
        forceString: {
            type: Boolean,
            default: true
32 33
        },
        defaultable: Boolean, // 是否默认选择第一个
dragondean@qq.com's avatar
dragondean@qq.com committed
34 35 36
    },
    data(){
        return {
37 38 39 40 41 42
            valueSync: this.multiple ? [] : null
        }
    },
    computed:{
        dictList(){
            return this.getList(this.type)
dragondean@qq.com's avatar
dragondean@qq.com committed
43 44 45 46 47 48 49
        }
    },
    watch:{
        valueSync(){
            this.$emit('input', this.forceString ? String(this.valueSync) : this.valueSync)
        },
        value(val){
50
            this.setValueSync()
51 52 53
        },
        dictList(){
            this.setDefault()
dragondean@qq.com's avatar
dragondean@qq.com committed
54 55
        }
    },
56 57
    created(){
        this.setValueSync()
58
        this.setDefault()
59
    },  
dragondean@qq.com's avatar
dragondean@qq.com committed
60
    methods:{
61 62 63
        setValueSync(){
            if(!this.value || this.value == '') return 
            if(this.forceString && this.multiple){
64
                this.valueSync = this.value.split(',')
65 66
            }else this.valueSync = this.forceString ? String(this.value) : this.value
        },
dragondean@qq.com's avatar
dragondean@qq.com committed
67
        getList(){
68 69 70 71 72 73 74
            return this.getDictDatas(this.type)
        },
        setDefault(){
            if(!this.defaultable) return 
            if(this.dictList.length && (this.valueSync === null || this.valueSync == '')){
                this.valueSync = this.dictList[0].value
            }
dragondean@qq.com's avatar
dragondean@qq.com committed
75 76 77
        }
    }
}
78 79 80 81 82 83
</script>
<style scoped>
.dict-selector{
    display: inline-block;
}
</style>