dec668478c85eebf10267b8cfaf4539f8d6185c9.svn-base 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. <!--
  2. 版本0.0.1
  3. 调用组件需要三个参数:
  4. 1、maxHeight 行政区划树选择面板的最大高度,类型:Number
  5. 2、maxWidth 行政区划树选择面板的宽度,类型:Number
  6. 3、rootAddCode
  7. -->
  8. <template>
  9. <div>
  10. <el-input
  11. ref="myInput"
  12. v-model="addvInfoShow"
  13. @focus="showSelet()"
  14. @clear="clearEvent()"
  15. clearable
  16. placeholder="接收单位">
  17. </el-input>
  18. <div
  19. class="mySelectTree"
  20. v-if="showMenuTree"
  21. v-loading="treeLoading"
  22. :style="{'width': maxWidth +'px'}">
  23. <el-row>
  24. <el-button type="text" style="float:right;padding:0;" @click="closeTree()" icon="el-icon-circle-close"></el-button>
  25. </el-row>
  26. <el-row>
  27. <el-tree
  28. :style="{'max-height': maxHeight +'px'}"
  29. style="overflow:auto;"
  30. class="filter-tree"
  31. accordion
  32. :props="defaultProps"
  33. node-key="id"
  34. :filter-node-method="filterNode"
  35. @node-click = 'treeNodeClickHandler'
  36. ref="tree"
  37. lazy
  38. :load="loadAddvData">
  39. </el-tree>
  40. </el-row>
  41. </div>
  42. </div>
  43. </template>
  44. <script>
  45. //这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
  46. //例如:import 《组件名称》 from '《组件路径》';
  47. import { getOrgByPid } from "@api/duChaAPI.js";
  48. export default {
  49. //import引入的组件需要注入到对象中才能使用
  50. props:['maxWidth','maxHeight','rootAddCode','addvInfoShow'],
  51. components: {},
  52. data() {
  53. //这里存放数据
  54. return {
  55. addvInfoShow:"",
  56. addvInfo:"",
  57. showMenuTree:false,
  58. filterText: '',
  59. treeData: [],
  60. defaultProps: {
  61. label: "name",
  62. children: "children",
  63. disabled: false,
  64. expandOnClickNode: false ,
  65. first:true,
  66. },
  67. treeLoading:true,
  68. };
  69. },
  70. //监控data中的数据变化
  71. //方法集合
  72. methods: {
  73. showSelet(){
  74. this.showMenuTree = true;
  75. this.getAdDataList();
  76. },
  77. filterNode(value, data, node) {
  78. // 如果什么都没填就直接返回
  79. if (!value) return true;
  80. // 如果传入的value和data中的nm相同就是匹配到了
  81. if (data.name.indexOf(value) !== -1) {
  82. return true;
  83. }
  84. // 否则要去判断它是不是选中节点的子节点
  85. return this.checkBelongToChooseNode(value, data, node);
  86. },
  87. // 判断传入的节点是不是选中节点的子节点
  88. checkBelongToChooseNode(value, data, node) {
  89. const level = node.level;
  90. // 如果传入的节点本身就是一级节点就不用校验
  91. if (level === 1) {
  92. return false;
  93. }
  94. // 先取当前节点的父节点
  95. let parentData = node.parent;
  96. // 遍历当前节点的父节点
  97. let index = 0;
  98. while (index < level - 1) {
  99. // 如果匹配到直接返回
  100. if (parentData.data.name.indexOf(value) !== -1) {
  101. return true;
  102. }
  103. // 否则的话再往上一层做匹配
  104. parentData = parentData.parent;
  105. index ++;
  106. }
  107. // 没匹配到返回false
  108. return false;
  109. },
  110. //获取行政区划树结构数据
  111. getAdDataList: function(node, resolve) {
  112. var _self = this;
  113. try {
  114. // if(this.rootAddCode){
  115. getOrgByPid(this.rootAddCode).then((res) =>{
  116. console.log(res);
  117. let children = [];
  118. res.data.forEach((element,index)=>{
  119. children.push({
  120. 'code':element.orgId,
  121. 'name':element.orgNm
  122. })
  123. });
  124. _self.treeData = children;
  125. _self.treeLoading =false;
  126. // if(children.length && children[0].code != '11' && children[0].code != '12'){
  127. // this.$emit("provTreeSelectChange", { code:children[0].code, name: children[0].name});
  128. // }
  129. },(err) =>{});
  130. // }
  131. } catch (e) {
  132. }
  133. },
  134. loadAddvData: function(node, resolve) {
  135. var _self = this;
  136. try {
  137. var code = "";
  138. if(node.data && node.data.code){
  139. code = node.data.code;
  140. }
  141. getOrgByPid(code).then(
  142. response => {
  143. var data = response.data;
  144. let children = [];
  145. response.data.forEach((element,index)=>{
  146. children.push({
  147. 'code':element.orgId,
  148. 'name':element.orgNm
  149. })
  150. });
  151. resolve(children);
  152. },
  153. response => {}
  154. );
  155. } catch (e) {
  156. }
  157. },
  158. //树节点点击事件
  159. treeNodeClickHandler:function(data,node,tree){
  160. this.$emit("provTreeSelectChange", { code:data.code, name: data.name});
  161. this.addvInfo = data.name;
  162. this.addvInfoShow = data.name;
  163. this.showMenuTree = false;
  164. },
  165. //清除操作
  166. clearEvent:function(){
  167. this.addvInfo = "";
  168. this.$emit('inputClear',this.addvInfo);
  169. },
  170. //关闭面板
  171. closeTree(){
  172. this.showMenuTree = false;
  173. }
  174. },
  175. beforeCreate() {}, //生命周期 - 创建之前
  176. beforeMount() {}, //生命周期 - 挂载之前
  177. beforeUpdate() {}, //生命周期 - 更新之前
  178. updated() {}, //生命周期 - 更新之后
  179. beforeDestroy() {}, //生命周期 - 销毁之前
  180. destroyed() {}, //生命周期 - 销毁完成
  181. activated() {}, //如果页面有keep-alive缓存功能,这个函数会触发
  182. }
  183. </script>
  184. <style >
  185. .mySelectTree{
  186. position: absolute;
  187. z-index: 20;
  188. width: 100%;
  189. border: 1px solid #e4e7ed;
  190. border-radius: 4px;
  191. box-shadow: 0 2px 12px 0 rgba(0,0,0,.1);
  192. box-sizing: border-box;
  193. margin: 5px 0;
  194. padding: 5px;
  195. background: #fff;
  196. }
  197. </style>