vue3+ts 封装 el-select

 封装组件

<template>
  <el-select
    v-model="content"
    :clearable="clearable"
    :placeholder="placeholder"
    :multiple="multiple"
    :collapse-tags="multiple && content.length > 7"
    :collapse-tags-tooltip="multiple && content.length > 7"
    @clear="clearChange"
    @change="iptChange"
  >
    <el-option
      v-for="item in option || lists"
      :key="item[configObj.value]"
      :label="item[configObj.label]"
      :value="item[configObj.value]"
      :disabled="item.disabled"
    />
  </el-select>
</template>

<script setup lang="ts">
import { reactive, ref, toRefs, onMounted, watch, defineProps, defineEmits } from 'vue';
import request from '@/utils/request';

const props = defineProps({
  modelValue: {
    type: [Number, String, Array],
    default: ''
  },
  clearable: {
    type: Boolean,
    default: false
  },
  multiple: {
    type: Boolean,
    default: false
  },
  placeholder: {
    type: String,
    default: ' '
  },
  /* 配置项 */
  configObj: {
    type: Object,
    default: () => {
      return {
        value: '', // value字段名
        label: '' // 显示名称
      };
    }
  },
  option: {
    type: Array,
    default: null
  },
  urls: {
    type: Object,
    default: () => {}
  },
  error: {
    type: Boolean,
    default: false
  }
});

const content = ref('');
const lists = ref([]);

const { proxy } = getCurrentInstance();
const emit = defineEmits(['update:modelValue', 'changeObj']);
const iptChange = (e: any) => {
  if (e) {
    emit('update:modelValue', e);
    emit('changeObj', (props.option || lists.value).filter((item: any) => item[props.configObj.value] == e)[0]);
  }
};

const clearChange = () => {
  content.value = '';
  emit('update:modelValue', '');
};

watch(
  () => props.modelValue,
  (value: any) => {
    if (value !== content.value) {
      content.value = value;
    }
  },
  { immediate: true }
);

//获取数据
const getData = () => {
  const requestData = {
    url: props.urls.url,
    method: props.urls.method || 'post'
  };

  props.urls.method === 'post' ? (requestData['data'] = props.urls.data) : '';

  request(requestData).then((res: any) => {
    lists.value = res.data;
  });
};

onMounted(() => {
  if (props.urls) {
    getData();
  }
});
</script>

 使用

 <mySelect
                v-model="forms.singleMachineCapacityValue"
                style="width: 100%"
                :config-obj="{ label: 'dictLabel', value: 'dictValue' }"
                :urls="{ method: 'get', url: '/system/dict/data/type/single_maine_capacityype' }"
                placeholder="请选择单机容量"
                clearable
                @change-obj="(val) => selectChange(val, 'singleMachineCapacityLabel')"
              />

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一路向北. 

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值