index.vue 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. <template>
  2. <div class="orgTree van-hairline--bottom">
  3. <tree-select
  4. @select="onSelect"
  5. v-model="selected"
  6. :options="orgTree"
  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 {mapGetters} from "vuex";
  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. computed: {
  37. ...mapGetters(['orgTree'])
  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. onSelect(value) {
  63. this.$emit('change', value.id)
  64. this.$emit('change', value)
  65. }
  66. },
  67. model: {
  68. prop: 'value',
  69. event: 'change'
  70. }
  71. }
  72. </script>
  73. <style>
  74. </style>
  75. <style lang="scss">
  76. .orgTree {
  77. font-size: 28px;
  78. svg {
  79. background-size: 22px 22px;
  80. width: 22px;
  81. height: 22px;
  82. }
  83. .vue-treeselect__control {
  84. width: 100%;
  85. height: 90px;
  86. padding: 0 20px;
  87. border-radius: 0;
  88. border: none;
  89. }
  90. .vue-treeselect__icon-warning{
  91. display: none;
  92. }
  93. .vue-treeselect__placeholder,
  94. .vue-treeselect__single-value {
  95. height: 90px;
  96. line-height: 90px;
  97. }
  98. .vue-treeselect__menu {
  99. padding: 20px;
  100. }
  101. .vue-treeselect__label {
  102. padding: 15px 20px;
  103. }
  104. .vue-treeselect__x-container {
  105. width: 50px;
  106. }
  107. .vue-treeselect__control-arrow-container {
  108. width: 50px;
  109. }
  110. .vue-treeselect--single .vue-treeselect__option--selected {
  111. font-weight: 500;
  112. color: #589eec;
  113. }
  114. }
  115. </style>