c037cda3c55fa9849d002fbc0916ac6166ddb192.svn-base 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. <!--
  2. 版本0.0.1
  3. 调用组件需要三个参数:
  4. 1、maxHeight 行政区划树选择面板的最大高度,类型:Number
  5. 2、maxWidth 行政区划树选择面板的宽度,类型:Number
  6. 3、rootAddCode 行政区划树的根节点,全国是12个0,类型String
  7. 4、level 行政区划树的查询深度等级,例如:根节点是全国,"3"是查到县级,类型String
  8. 5、nameOrCode 父组件需要的是行政区划名称或行政区划编码
  9. -->
  10. <template>
  11. <div>
  12. <el-input
  13. ref="myInput"
  14. v-model="addvInfoShow"
  15. @input="addvInfo"
  16. @focus="showSelet()"
  17. @clear="clearEvent()"
  18. clearable
  19. placeholder="">
  20. </el-input>
  21. <div
  22. class="mySelectTree"
  23. v-if="showMenuTree"
  24. v-loading="treeLoading"
  25. :style="{'width': maxWidth +'px'}">
  26. <el-row>
  27. <el-button type="text" style="float:right;padding:0;" @click="closeTree()" icon="el-icon-circle-close"></el-button>
  28. </el-row>
  29. <el-row>
  30. <el-tree
  31. :style="{'max-height': maxHeight +'px'}"
  32. style="overflow:auto;"
  33. class="filter-tree"
  34. :data="treeData"
  35. accordion
  36. :props="defaultProps"
  37. node-key="id"
  38. :filter-node-method="filterNode"
  39. @node-click = 'treeNodeClickHandler'
  40. ref="tree">
  41. </el-tree>
  42. </el-row>
  43. </div>
  44. </div>
  45. </template>
  46. <script>
  47. //这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
  48. //例如:import 《组件名称》 from '《组件路径》';
  49. import { getAddTree} from "../api/duChaAPI.js";
  50. export default {
  51. //import引入的组件需要注入到对象中才能使用
  52. props:['maxWidth','maxHeight','rootAddCode','level','value','nameOrCode',"ifInstitutions"],
  53. components: {},
  54. data() {
  55. //这里存放数据
  56. return {
  57. addvInfoShow:"",
  58. addvInfo:"",
  59. showMenuTree:false,
  60. filterText: '',
  61. treeData: [],
  62. defaultProps: {
  63. children: 'children',
  64. label: 'nm'
  65. },
  66. treeLoading:true,
  67. };
  68. },
  69. //监听属性 类似于data概念
  70. computed: {},
  71. //监控data中的数据变化
  72. watch: {
  73. addvInfo(val) {
  74. if(this.$refs.tree){
  75. this.$refs.tree.filter(val);
  76. }
  77. this.$emit('input',this.addvInfo);
  78. },
  79. value:function(){
  80. this.addvInfoShow = this.value;
  81. }
  82. },
  83. //方法集合
  84. methods: {
  85. showSelet(){
  86. // alert(1);
  87. this.showMenuTree = true;
  88. this.getAdDataList();
  89. },
  90. filterNode(value, data, node) {
  91. // 如果什么都没填就直接返回
  92. if (!value) return true;
  93. // 如果传入的value和data中的nm相同就是匹配到了
  94. if (data.nm.indexOf(value) !== -1) {
  95. return true;
  96. }
  97. // 否则要去判断它是不是选中节点的子节点
  98. return this.checkBelongToChooseNode(value, data, node);
  99. },
  100. // 判断传入的节点是不是选中节点的子节点
  101. checkBelongToChooseNode(value, data, node) {
  102. const level = node.level;
  103. // 如果传入的节点本身就是一级节点就不用校验
  104. if (level === 1) {
  105. return false;
  106. }
  107. // 先取当前节点的父节点
  108. let parentData = node.parent;
  109. // 遍历当前节点的父节点
  110. let index = 0;
  111. while (index < level - 1) {
  112. // 如果匹配到直接返回
  113. if (parentData.data.nm.indexOf(value) !== -1) {
  114. return true;
  115. }
  116. // 否则的话再往上一层做匹配
  117. parentData = parentData.parent;
  118. index ++;
  119. }
  120. // 没匹配到返回false
  121. return false;
  122. },
  123. //获取行政区划树结构数据
  124. getAdDataList: function(node, resolve) {
  125. var _self = this;
  126. try {
  127. getAddTree(_self.rootAddCode,_self.level).then((res)=>{
  128. if(res.data){
  129. _self.treeData = res.data.children;
  130. _self.treeLoading =false;
  131. }
  132. })
  133. } catch (e) {
  134. }
  135. },
  136. //树节点点击事件
  137. treeNodeClickHandler:function(data,node,tree){
  138. //机构管理默认展示行政区划代码
  139. if(this.ifInstitutions === "adCode"){
  140. this.addvInfoShow = data.id;
  141. }else if(this.ifInstitutions === "rlCode"){
  142. this.addvInfoShow = data.pid;
  143. }else{
  144. //判断父组件需要的是行政区名称或者编码
  145. if(this.nameOrCode == 'name'){
  146. this.addvInfo = data.nm;
  147. this.addvInfoShow = data.nm;
  148. }else{
  149. this.addvInfo = data.id;
  150. this.addvInfoShow = data.nm;
  151. }
  152. }
  153. this.$emit('addvTreeNodeClick',data);
  154. this.showMenuTree = false;
  155. },
  156. //清除操作
  157. clearEvent:function(){
  158. // this.$emit('addvTreeNodeClick',"");
  159. this.addvInfo = "";
  160. this.$emit('input',this.addvInfo);
  161. },
  162. //关闭面板
  163. closeTree(){
  164. this.showMenuTree = false;
  165. }
  166. },
  167. //生命周期 - 创建完成(可以访问当前this实例)
  168. created() {
  169. },
  170. //生命周期 - 挂载完成(可以访问DOM元素)
  171. mounted() {
  172. this.addvInfo = this.value;
  173. this.$refs.myInput.$el;
  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>