ExtSelect.vue 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. <template>
  2. <el-select-v2
  3. :options="state.list"
  4. :disabled="disabled"
  5. :multiple="multiple"
  6. filterable
  7. :clearable="clearable"
  8. :placeholder="placeholder"
  9. :max-collapse-tags="max"
  10. @change="handleValueChange"
  11. @clear="handleValueClear"
  12. v-model="state.modelVal">
  13. <template #empty>
  14. <el-empty :image-size="40"/>
  15. </template>
  16. <template #prefix>
  17. <SvgIcon :name="prefix"/>
  18. </template>
  19. <!-- <el-option :key="item.id" v-for="item in state.list" :value="item.id" :label="item.name||item.title"> {{ item.name || item.title }}</el-option>-->
  20. </el-select-v2>
  21. </template>
  22. <script lang="ts" setup name="ExtSelect">
  23. import {onMounted, ref, nextTick, watch, reactive} from 'vue';
  24. import u from "/@/utils/u";
  25. import {$body, $post,$get} from "/@/utils/request";
  26. const emit = defineEmits(['update:modelValue', 'on-change']);
  27. const props = defineProps({
  28. modelValue: {
  29. type: Number
  30. },
  31. prefix: {
  32. type: String
  33. },
  34. max: {
  35. type: Number,
  36. default: 3
  37. },
  38. url: {
  39. type: String
  40. },
  41. query: {
  42. type: Object
  43. },
  44. disabled: {
  45. type: Boolean,
  46. default: false
  47. },
  48. clearable: {
  49. type: Boolean,
  50. default: true
  51. },
  52. multiple: {
  53. type: Boolean,
  54. default: false
  55. },
  56. placeholder: {
  57. type: String,
  58. default: '请选择'
  59. },
  60. dataList: {
  61. type: Array<any>
  62. },
  63. urlMethod:{
  64. type:String,
  65. default:'post'
  66. },
  67. labelKey:{
  68. type:String,
  69. default:'name'
  70. },
  71. valueKey:{
  72. type:String,
  73. default:'id'
  74. }
  75. })
  76. const state = reactive({
  77. list: [] ,
  78. modelVal: null
  79. })
  80. watch(()=>props.modelValue,(val)=>{
  81. console.log("watch>>>",val)
  82. state.modelVal = val;
  83. })
  84. onMounted(() => {
  85. loadData();
  86. })
  87. const loadData = () => {
  88. if (!u.isEmptyOrNull(props.dataList)) {
  89. state.list = props.dataList;
  90. } else {
  91. if (!props.url) {
  92. return;
  93. }
  94. var query = {
  95. pageIndex: 1,
  96. pageSize: 200,
  97. };
  98. if (props.query) {
  99. query = Object.assign({}, query, props.query);
  100. }
  101. if(props.urlMethod?.toLowerCase()==='post'){
  102. $body(`${props.url}`, query).then((list: any) => {
  103. // let {list,count} = res;
  104. state.list = list.map((k:any)=>{
  105. return {value:k[props.valueKey],label:k[props.labelKey]}
  106. })
  107. console.log(state.list)
  108. // state.value.list = res?.list
  109. });
  110. }else{
  111. $get(`${props.url}`, query).then((list: any) => {
  112. // let {list,count} = res;
  113. state.list = list.map((k:any)=>{
  114. return {value:k[props.valueKey],label:k[props.labelKey]}
  115. })
  116. console.log(state.list)
  117. // state.value.list = res?.list
  118. });
  119. }
  120. }
  121. }
  122. const handleValueChange = (val: any) => {
  123. nextTick(() => {
  124. console.log("handleValueChange--->", val)
  125. emit("update:modelValue", val);
  126. emit("on-change", val);
  127. })
  128. }
  129. const handleValueClear = () => {
  130. // props.query.id = undefined;
  131. // this.query['id'] = undefined;
  132. // let val: any = [];
  133. // if (!props.multiple) {
  134. // val = undefined;
  135. // }
  136. // // emit("update:value", val);
  137. // // emit("change", val);
  138. // loadData();
  139. }
  140. </script>