selectCascader.vue 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. <template>
  2. <el-select
  3. v-model="selectValue"
  4. :multiple="multiple"
  5. filterable
  6. remote
  7. :size="size"
  8. clearable
  9. collapse-tags
  10. :style="itemStyles"
  11. :placeholder="placeholder"
  12. :remote-method="remoteMethod"
  13. @change="changeCascader"
  14. >
  15. <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value">
  16. {{ item.deptPath }}
  17. </el-option>
  18. </el-select>
  19. </template>
  20. <script>
  21. /**
  22. * 提炼自月报的团队选择器
  23. * 使用前,需要在组件渲染前,配合 vuex 中的获取部门数据的 actions 的方法来使页面自动获取数据
  24. * 在 created 或者 mounted 中 放入下面这句函数即可
  25. * 示例:获取部门数据
  26. * this.$store.dispatch('monthlyReportEdit/setSelectEnum')
  27. * 模版中的用法
  28. * <!-- 团队选择 -->
  29. * <selectCascader
  30. * v-else-if="type === 'cascader'"
  31. * v-model="val"
  32. * :size="size"
  33. * :placeholder="placeholder"
  34. * :style="itemStyles"
  35. * @change="(e) => $emit('onChange', e)"
  36. * />
  37. */
  38. export default {
  39. name: 'SelectCascader',
  40. props: {
  41. multiple: {
  42. type: Boolean,
  43. required: false,
  44. default: () => true
  45. },
  46. value: {
  47. type: [Array, String, Number],
  48. required: false,
  49. default: () => []
  50. },
  51. itemStyles: {
  52. type: Object,
  53. default: () => ({ width: '100%' }),
  54. required: false
  55. },
  56. size: {
  57. type: String,
  58. required: false,
  59. default: 'small'
  60. },
  61. placeholder: {
  62. type: String,
  63. required: false,
  64. default: '请选择'
  65. }
  66. },
  67. data() {
  68. return {
  69. selectValue: this.value,
  70. options: []
  71. }
  72. },
  73. computed: {
  74. selectEnum() {
  75. return this.$store.state.monthlyReportEdit.selectEnum
  76. }
  77. },
  78. watch: {
  79. value() {
  80. this.init()
  81. },
  82. selectEnum() {
  83. this.init()
  84. }
  85. },
  86. mounted() {
  87. // this.selectValue = this.value
  88. this.init()
  89. },
  90. methods: {
  91. init() {
  92. if (this.value && this.value.length) {
  93. this.options = []
  94. this.selectValue = this.value.map(elm => {
  95. this.find(elm, 'value')
  96. return `${elm}`
  97. })
  98. this.$forceUpdate()
  99. }
  100. },
  101. find(id, key = 'value') {
  102. const run = (arr) => {
  103. for (let i = 0; i < arr.length; i++) {
  104. const elm = arr[i]
  105. if (key === 'value' && `${elm[key]}` === `${id}`) {
  106. if (this.isHave(`${id}`) < 0) {
  107. this.$set(this.options, this.options.length, elm)
  108. }
  109. }
  110. const reg = new RegExp(id, 'i')
  111. if (key === 'label' && reg.test(`${elm[key]}`)) {
  112. if (this.isHave(`${id}`) < 0 && elm.valid) {
  113. this.$set(this.options, this.options.length, elm)
  114. }
  115. }
  116. if (elm.children) {
  117. run(elm.children)
  118. }
  119. }
  120. }
  121. run(this.selectEnum)
  122. },
  123. isHave(id) {
  124. // console.log(id)
  125. let itemIndex = -1
  126. for (let index = 0; index < this.options.length; index++) {
  127. const element = this.options[index]
  128. // console.log(element)
  129. if (`${element.value}` === `${id}`) {
  130. itemIndex = index
  131. }
  132. }
  133. return itemIndex
  134. },
  135. async remoteMethod(query) { // 获取部门option
  136. if (query !== '') {
  137. this.options = []
  138. this.find(query, 'label')
  139. }
  140. },
  141. changeCascader(value) {
  142. this.$emit('input', value)
  143. console.log(141, value)
  144. this.$emit('change', value)
  145. }
  146. }
  147. }
  148. </script>
  149. <style scoped lang="less"></style>