封装el-select

发布时间 2023-10-10 17:58:58作者: 一文搞懂

效果:给select组件传入option请求方法,父组件无需再进行其他操作

 

<template>
  <el-select v-model="selectValue" multiple clearable @change="emitChange" value-key="id" placeholder="请选择车辆">
    <el-option v-for="item in options" :key="item.id" :label="item.name" :value="item.id" />
  </el-select>
</template>

<script lang="ts" setup>
import { ref, onMounted } from "vue";
const emit = defineEmits(["update:modelValue"]);

//接收父组件v-model传递过来的值
const props = defineProps({
  modelValue: {
    type: [String]
  },
  api: {
    type: Function,
    required: true
  }
});

//el-select的v-model不能绑定prop属性,所以定义本地变量一个
const selectValue = ref<string[]>([]);

//引入修改方法update:modelValue
const emitChange = () => {
  //change事件中需要将这个值传递给更新方法,即update:modelValue
  emit("update:modelValue", selectValue.value.join(","));
};

//定义数据源,并从服务器获取数据
const options = ref([]);
onMounted(async () => {
  let res = await props.api({});
  console.log(res.data);
  const newData = res.data.map(item => ({
    ...item,
    id: item.id.toString()
  }));

  options.value = newData;
  selectValue.value = props.modelValue ? props.modelValue.split(",") : [];
});
</script>

 

使用:

 <MySelect v-model="drawerProps.row!.model" :api="getTableInfoList"></MySelect>

 

总结: 得不偿失!!!