index.vue 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. <template>
  2. <div class="orgTree van-hairline--bottom">
  3. <tree-select
  4. @select="onSelect"
  5. v-model="selected"
  6. :options="treeData"
  7. :clearable="false"
  8. :backspaceRemoves="false"
  9. placeholder="请选择归属机构"
  10. :normalizer="tenantIdnormalizer"
  11. :show-count="true"
  12. :noChildrenText="''">
  13. </tree-select>
  14. </div>
  15. </template>
  16. <script>
  17. import TreeSelect from '@riophae/vue-treeselect'
  18. import '@riophae/vue-treeselect/dist/vue-treeselect.css'
  19. import { deptTreeList } from '@/api/public'
  20. export default {
  21. components: {
  22. TreeSelect
  23. },
  24. props: {
  25. value: {
  26. type: [String,Number],
  27. default: null
  28. }
  29. },
  30. data() {
  31. return {
  32. treeData: [],
  33. selected: null,
  34. }
  35. },
  36. created() {
  37. this.getTreeList();
  38. },
  39. watch: {
  40. value: {
  41. handler(val) {
  42. if(!val){
  43. this.selected = null
  44. }else {
  45. this.selected = this.value
  46. }
  47. },
  48. },
  49. },
  50. methods: {
  51. /** treeSelect组件自定义数据*/
  52. tenantIdnormalizer(node, instanceId) {
  53. if (!node.children || !node.children.length) {
  54. delete node.children
  55. }
  56. return {
  57. id: node.id,
  58. label: node.name,
  59. children: node.children
  60. }
  61. },
  62. //获取机构树
  63. getTreeList() {
  64. deptTreeList(this.orgId).then(res => {
  65. this.$nextTick(() => {
  66. this.treeData = res.data
  67. })
  68. })
  69. },
  70. onSelect(value) {
  71. this.$emit('change', value.id)
  72. this.$emit('changeItem', value)
  73. }
  74. },
  75. model: {
  76. prop: 'value',
  77. event: 'change'
  78. }
  79. }
  80. </script>
  81. <style>
  82. </style>
  83. <style lang="scss">
  84. .orgTree {
  85. font-size: 28px;
  86. svg {
  87. background-size: 22px 22px;
  88. width: 22px;
  89. height: 22px;
  90. }
  91. .vue-treeselect__control {
  92. width: 100%;
  93. height: 90px;
  94. padding: 0 20px;
  95. border-radius: 0;
  96. border: none;
  97. }
  98. .vue-treeselect__icon-warning{
  99. display: none;
  100. }
  101. .vue-treeselect__placeholder,
  102. .vue-treeselect__single-value {
  103. height: 90px;
  104. line-height: 90px;
  105. }
  106. .vue-treeselect__menu {
  107. padding: 20px;
  108. }
  109. .vue-treeselect__label {
  110. padding: 15px 20px;
  111. }
  112. .vue-treeselect__x-container {
  113. width: 50px;
  114. }
  115. .vue-treeselect__control-arrow-container {
  116. width: 50px;
  117. }
  118. .vue-treeselect--single .vue-treeselect__option--selected {
  119. font-weight: 500;
  120. color: #589eec;
  121. }
  122. }
  123. </style>