ee5aafbad5beb1fd993aa760617cc17697e862a0.svn-base 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. <template>
  2. <div class="j-area-linkage">
  3. <div v-if="reloading">
  4. <span> Reloading... </span>
  5. </div>
  6. <area-cascader
  7. v-else-if="_type === enums.type[0]"
  8. :value="innerValue"
  9. :data="pcaa"
  10. :level="0"
  11. :style="{width}"
  12. expandTrigger='hover'
  13. v-bind="$attrs"
  14. v-on="_listeners"
  15. @change="handleChange"
  16. />
  17. <area-select
  18. v-else-if="_type === enums.type[1]"
  19. :value="innerValue"
  20. :data="pcaa"
  21. :level="2"
  22. v-bind="$attrs"
  23. v-on="_listeners"
  24. @change="handleChange"
  25. />
  26. <div v-else>
  27. <span style="color:red;"> Bad type value: {{_type}}</span>
  28. </div>
  29. </div>
  30. </template>
  31. <script>
  32. import Area from '@/components/_util/Area'
  33. export default {
  34. name: 'JAreaLinkage',
  35. props: {
  36. value: {
  37. type: String,
  38. required:false
  39. },
  40. // 组件的类型,可选值:
  41. // select 下拉样式
  42. // cascader 级联样式(默认)
  43. type: {
  44. type: String,
  45. default: 'cascader'
  46. },
  47. width: {
  48. type: String,
  49. default: '100%'
  50. }
  51. },
  52. data() {
  53. return {
  54. pcaa: this.$Jpcaa,
  55. innerValue: [],
  56. usedListeners: ['change'],
  57. enums: {
  58. type: ['cascader', 'select']
  59. },
  60. reloading: false,
  61. areaData:''
  62. }
  63. },
  64. computed: {
  65. _listeners() {
  66. let listeners = { ...this.$listeners }
  67. // 去掉已使用的事件,防止冲突
  68. this.usedListeners.forEach(key => {
  69. delete listeners[key]
  70. })
  71. return listeners
  72. },
  73. _type() {
  74. if (this.enums.type.includes(this.type)) {
  75. return this.type
  76. } else {
  77. console.error(`JAreaLinkage的type属性只能接收指定的值(${this.enums.type.join('|')})`)
  78. return this.enums.type[0]
  79. }
  80. },
  81. },
  82. watch: {
  83. value: {
  84. immediate: true,
  85. handler() {
  86. this.loadDataByValue(this.value)
  87. }
  88. },
  89. },
  90. created() {
  91. this.initAreaData();
  92. },
  93. methods: {
  94. /** 重新加载组件 */
  95. reload() {
  96. this.reloading = true
  97. this.$nextTick(() => this.reloading = false)
  98. },
  99. /** 通过 value 反推 options */
  100. loadDataByValue(value) {
  101. if (!value || value.length === 0) {
  102. this.innerValue = []
  103. } else {
  104. this.initAreaData()
  105. let arr = this.areaData.getRealCode(value)
  106. this.innerValue = arr
  107. }
  108. this.reload()
  109. },
  110. /** 通过地区code获取子级 */
  111. loadDataByCode(value) {
  112. let options = []
  113. let data = this.pcaa[value]
  114. if (data) {
  115. for (let key in data) {
  116. if (data.hasOwnProperty(key)) {
  117. options.push({ value: key, label: data[key], })
  118. }
  119. }
  120. return options
  121. } else {
  122. return []
  123. }
  124. },
  125. /** 判断是否有子节点 */
  126. hasChildren(options) {
  127. options.forEach(option => {
  128. let data = this.loadDataByCode(option.value)
  129. option.isLeaf = data.length === 0
  130. })
  131. },
  132. handleChange(values) {
  133. let value = values[values.length - 1]
  134. this.$emit('change', value)
  135. },
  136. initAreaData(){
  137. if(!this.areaData){
  138. this.areaData = new Area(this.$Jpcaa);
  139. }
  140. },
  141. },
  142. model: { prop: 'value', event: 'change' },
  143. }
  144. </script>
  145. <style lang="less" scoped>
  146. .j-area-linkage {
  147. height:40px;
  148. /deep/ .area-cascader-wrap .area-select {
  149. width: 100%;
  150. }
  151. /deep/ .area-select .area-selected-trigger {
  152. line-height: 1.15;
  153. }
  154. }
  155. </style>