PagedSelect.vue 4.35 KB
<template>
    <el-select
        :id="id"  v-model="model" v-bind="$attrs"
        v-on="$listeners" 
        :disabled="disabled" 
        :clearable="clearable"
        :multiple="multiple"
        :loading="loading"
        @change="handelSelChange">
        <div v-if="queryable" style="width:90%;margin-left:5%">
            <el-input v-model="cond">
                <i slot="suffix" class="el-input__icon el-icon-search" @click="getOptions(1)" @keyup.enter="getOptions(1)"></i>
            </el-input>
        </div>
        <el-option 
            v-for="item in options" 
            :key="item.value"
            :label="item.label"
            :value="item.value"
        >
        </el-option>
        <el-pagination 
            :total="total" 
            :current-page="current" 
            :page-size="pagesize" 
            @current-change="handleCurrentChange" 
            layout="prev,pager,next">
        </el-pagination>
    </el-select>
</template>
<script>
import request from '~/utils/request'
export default {
    props:{
        value: {
            type:[String,Number,Array],
            default: undefined
        },
        disabled: {
            type: Boolean,
            default: false
        },
        placeholder:{
            type:String,
            default: '请选择'
        },
        clearable: {
            type: Boolean,
            default: true
        },
        multiple: {
            type: Boolean,
            default: false
        },
        id: {
            type: String,
            default: ''
        },
        remote:{
            type:Boolean,
            default:true
        },
        filterable:{
            type:Boolean,
            default:true
        },
        url:{
            type:String,
            required:true
        },
        code:{
            type:String,
            required:true
        },
        name:{
            type:String,
            required:true
        },
        pagesize:{
            type:Number,
            default:20
        },
        queryable:{
            type:Boolean,
            default:true
        }
    },
    data(){
        return {
            loading:false,
            options:[],
            total:0,
            current:1,
            isMounted:false,
            cond:'',
        }
    },
    computed:{
        model:{
            get(){
                if(this.multiple && typeof this.value == 'string'){
                    return this.value.split(',')
                }else{
                    return this.value
                }
            },
            set(newVal) {
                //this.value = newVal.join(',')
                console.log(newVal)
                if(this.multiple){
                    let valStr = newVal.join(',')
                    this.$emit('input', valStr)
                }else{
                    this.$emit('input', newVal)
                }
                //this.$emit('update:value',newVal)
            }
        }
    },
    watch:{
        /*model:{
            handler(newVal,oldVal){
                this.$emit('update:value',newVal)
            },
            deep:true
        },*/
        current(val){
            
        }
    },
    mounted(){
        this.getOptions(1)
    },
    methods:{
        async getOptions(page){
            if (this.url) {
                let self = this
                self.loading = true
                self.options = []
                let requrl = self.url+"?pageIndex="
                    +page
                    +"&pageSize="+self.pagesize
                Request.post(requrl, {'cond':this.cond}).then(res => {
                    if (res.code === SUCCESS) {
                        for(let item of res.data){
                            let obj = {}
                            obj.key = item[self.code]
                            obj.label = item[self.name]
                            obj.value = item[self.code]
                            self.options.push(obj)
                        }
                        self.total = res.pageInfo && res.pageInfo.total || 0
                        self.loading = false
                    }
                }).catch(err=> {
                    self.loading = false
                })
            }
        },
        handleCurrentChange(val){
            this.current = val
            this.getOptions(val)
        },
        handelSelChange(sels){
            
        }
    }
}
</script>