0de50984826d71b4eeb3165b9e6d585496e51e86.svn-base 3.6 KB

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