前端转vue
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

index.vue 5.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. <template>
  2. <div>
  3. <a-select style="display: block;" v-model:value="svalue" placeholder="请选择" v-bind="$attrs"
  4. @change="handleChange" @select="handleSelect">
  5. <a-select-option v-for="item in options" :key="item.item_no" :value="item.item_no" v-bind="item">
  6. {{ item.item_name }}
  7. </a-select-option>
  8. </a-select>
  9. </div>
  10. </template>
  11. <script>
  12. import {
  13. getOptions
  14. } from '@/api/common'
  15. export default {
  16. name: 'ProSelect',
  17. props: {
  18. modelValue: [String, Array], // 更改为 modelValue
  19. optionData: Array,
  20. readText: {
  21. type: [String, Array],
  22. default: null
  23. },
  24. readValue: {
  25. type: [String, Array],
  26. default: null
  27. },
  28. formItemProps: Object, // 定义formItemProps prop
  29. },
  30. inject: {
  31. pageIsReadOnly: {
  32. default: false
  33. }
  34. },
  35. emits: ['update:modelValue', 'change', 'select', 'easyUiSelect', 'input'], // 添加 update:modelValue 事件
  36. watch: {
  37. //判断下拉框的值是否有改变
  38. svalue (val, oldVal) {
  39. const that = this
  40. if (val != oldVal) {
  41. that.$emit('input', this.svalue)
  42. that.$emit('update:modelValue', this.svalue) // 确保使用 update:modelValue
  43. if (this.$attrs["collapse-tags"] != undefined) {
  44. this.$nextTick(() => {
  45. //下拉框视口总宽度
  46. let elClientWidth = this.$el.clientWidth
  47. //首个tag
  48. let firstTabDom = this.$el?.childNodes[0]?.childNodes[0]?.childNodes[0].children[0]
  49. //下一个tag
  50. let nextTabDom = this.$el?.childNodes[0]?.childNodes[0]?.childNodes[0].children[1]
  51. if (firstTabDom) {
  52. //判断宽度是否超出输入框之前,先恢复宽度
  53. firstTabDom.style.width = "auto"
  54. if (nextTabDom?.className?.indexOf("el-tag") > -1) {
  55. let firstTabOffsetWidth = firstTabDom.offsetWidth
  56. let nextTabOffsetWidth = nextTabDom.offsetWidth
  57. if (firstTabOffsetWidth + nextTabOffsetWidth > elClientWidth - 45) {
  58. //firstTabOffsetWidth = 下拉框的宽度 - 下拉框的内边距(45)-nextTabOffsetWidth
  59. firstTabDom.style.width = elClientWidth - 45 - nextTabOffsetWidth + "px"
  60. }
  61. }
  62. }
  63. if (nextTabDom && nextTabDom?.className == undefined) {
  64. firstTabDom.style.width = "auto"
  65. }
  66. })
  67. }
  68. }
  69. },
  70. modelValue: {
  71. immediate: true,
  72. handler (newVal) {
  73. this.svalue = newVal;
  74. }
  75. },
  76. optionData (val, oldVal) {
  77. if (JSON.stringify(val) != JSON.stringify(oldVal)) {
  78. this.options = this.optionData
  79. }
  80. }
  81. },
  82. mounted () {
  83. console.log("wyq-ProSelect mounted", this.$attrs);
  84. const optionData = this.optionData
  85. //初始话下拉框的值
  86. const {
  87. colName,
  88. tableName,
  89. url
  90. } = this.$attrs
  91. //静态变量直接赋值
  92. if (optionData) {
  93. this.options = optionData
  94. } else {
  95. let queyUrl = ''
  96. let params
  97. //通过字段和表名查tbl
  98. if (colName && tableName) {
  99. queyUrl = '/system/select/options/loadTbl'
  100. params = {
  101. colName,
  102. tableName
  103. }
  104. } else if (url) { //自定义查询
  105. queyUrl = url
  106. params = {}
  107. }
  108. if (queyUrl) {
  109. getOptions(queyUrl, params)
  110. .then((response) => {
  111. if (response != null) {
  112. this.options = response
  113. }
  114. })
  115. }
  116. }
  117. },
  118. created () {
  119. },
  120. methods: {
  121. handleChange (data, node, event) {
  122. // this.$emit('input', data);
  123. this.$emit('change', data, node, event)
  124. this.$emit('update:modelValue', data); // 确保使用 update:modelValue
  125. },
  126. handleSelect (value, option) {
  127. this.$emit('select', value, option)
  128. //兼容easyUi写法
  129. this.$emit('easyUiSelect', { item_no: value, item_name: option.title })
  130. this.$emit('update:modelValue', value); // 在选择时也更新 modelValue
  131. },
  132. // 设置下拉数据源
  133. setSelectOptions (data) {
  134. console.log("setSelectOptions", data);
  135. data = data.map(item => {
  136. if (item.item_no && item.item_name) {
  137. item.item_no = item.item_no;
  138. item.item_name = item.item_name;
  139. }
  140. return item;
  141. })
  142. this.options = data
  143. },
  144. // 获取下拉数据源
  145. getSelelctOptions () {
  146. return this.options
  147. }
  148. },
  149. data () {
  150. return {
  151. options: [],
  152. svalue: this.modelValue // 初始化 svalue
  153. }
  154. }
  155. }
  156. </script>
  157. <style></style>