之所以使用懒加载是为了提高性能,而且只有在懒加载模式下默认会给所有显示节点设置展开按钮。leaf也可以做到,但是要操作数据比较麻烦。

要实现懒加载模式下的模糊查询以及重新加载必须要使用data与lazy、load相结合。

lazy和load负责树的初始加载和懒加载,还要绑定node-expand事件加载子节点数据。

data负责模糊查询下填充查询结果树,它与懒加载结合使用并不冲突。

关键code一:

  1. this.$nextTick(() => {
  2. let nodedata = this.node.childNodes[0]
  3. nodedata.expanded = true
  4. nodedata.loadData()
  5. })

作用:在初次设置顶级菜单并想展开二级菜单时候必须用到,在根节点渲染上去后执行展开并加载二级节点。

关键code二:

  1. /**
  2. * @param item 搜索输入内容
  3. */
  4. treeChange(item) {
  5. //存储 搜索输入的值
  6. if (item || item === 0) {
  7. let params = { organizationId: item.organizationId, dimon: this.dimensionModel }
  8. changeTreeData(params).then((res) => {
  9. this.treeData = res.resultData.organizationVos
  10. })
  11. }
  12. },

作用:在搜索控件值改变后触发,查询结果赋值给data达到重新加载tree的目的。

关键code三:

  1. /**
  2. * 重载树
  3. */
  4. reloadTree() {
  5. this.node.childNodes = []
  6. this.loadNode(this.node, this.resolveFunc)
  7. }

作用:初始化Tree控件数据,node和resolveFunc两个参数需要在load绑定的事件中手动缓存起来方便之后调用。

最后附上源码给大家参考!!!

  1. <template>
  2. <div class="ns-biz-many-type-tree">
  3. <div>
  4. <el-select v-model="value" placeholder="请选择" size="small">
  5. <el-option
  6. v-for="item in treeTypeOptions"
  7. :key="item.value"
  8. :label="item.label"
  9. :value="item.value"
  10. @change="treeTypeChange"
  11. >
  12. </el-option>
  13. </el-select>
  14. <el-button type="primary" size="small">搜索</el-button>
  15. </div>
  16.  
  17. <el-autocomplete
  18. v-model="treeSearchInput"
  19. :fetch-suggestions="remoteSearch"
  20. value-key="organizationName"
  21. placeholder="请输入内容"
  22. size="small"
  23. @select="treeChange"
  24. >
  25. <i class="el-icon-search el-input__icon" slot="suffix" @click="handleIconClick"> </i
  26. ></el-autocomplete>
  27.  
  28. <el-tree
  29. ref="newTree"
  30. :props="defaultProps"
  31. :data="treeData"
  32. lazy
  33. :load="loadNode"
  34. @check-change="handleCheckChange"
  35. @node-expand="expandNode"
  36. >
  37. </el-tree>
  38. </div>
  39. </template>
  40. <script>
  41. import {
  42. getOrgTreeData,
  43. getOrgTreeChildData,
  44. getSearchData,
  45. changeTreeData,
  46. } from './service/NS-biz-organize-tree'
  47. export default {
  48. name: 'Ns-biz-many-type-tree',
  49. props: {},
  50. data() {
  51. return {
  52. treeData: [],
  53. treeTypeOptions: [
  54. {
  55. value: '1',
  56. label: '组织架构',
  57. labelName: 'organizationName',
  58. childrenName: 'childOrganizations',
  59. },
  60. {
  61. value: '2',
  62. label: '工作组',
  63. labelName: 'groupName',
  64. childrenName: 'childGroup',
  65. },
  66. ],
  67. defaultProps: {
  68. label: 'organizationName',
  69. children: 'childOrganizations',
  70. },
  71. node: {},
  72. treeSearchInput: '',
  73. value: '1',
  74. topMenuName: '',
  75. dimensionModel: 'adm',
  76. resolveFunc: function () {},
  77. }
  78. },
  79. mounted() {
  80.  
  81. },
  82. methods: {
  83. // 树节点点击事件
  84. handleCheckChange() {},
  85. // 树类型切换事件
  86. treeTypeChange() {},
  87. //快捷图标搜索
  88. handleIconClick() {},
  89. querySearchAsync() {},
  90. // 加载Tree节点
  91. loadNode(node, resolve) {
  92. console.log('树对象', node)
  93. if (node.level === 0) {
  94. this.node = node
  95. this.resolveFunc = resolve
  96. // 组织架构树
  97. if (this.value == '1') {
  98. getOrgTreeData({ dimon: this.dimensionModel, selectAll: false }).then((res) => {
  99. let { organizationVos } = res.resultData
  100. this.$nextTick(() => {
  101. let nodedata = this.node.childNodes[0]
  102. nodedata.expanded = true
  103. nodedata.loadData()
  104. })
  105. return resolve([
  106. {
  107. organizationName: organizationVos[0].organizationName,
  108. organizationId: organizationVos[0].organizationId,
  109. },
  110. ])
  111. })
  112. } else {
  113. }
  114. } else {
  115. setTimeout(() => {
  116. getOrgTreeChildData({
  117. id: node.data.organizationId,
  118. dimon: this.dimensionModel,
  119. selectAll: false,
  120. }).then((res) => {
  121. resolve(res.resultData.organizationVos)
  122. })
  123. }, 500)
  124. }
  125. },
  126. // 节点展开事件
  127. expandNode(obj, node, self) {
  128. if (node.level !== 0) {
  129. console.log('node', node)
  130. if (node.data.childOrganizations == null) {
  131. if (this.value == '1') {
  132. getOrgTreeChildData({
  133. id: node.data.organizationId,
  134. dimon: this.dimensionModel,
  135. selectAll: false,
  136. }).then((res) => {
  137. node.data.childOrganizations = res.resultData.organizationVos
  138. })
  139. } else {
  140. }
  141. }
  142. }
  143. },
  144. /**
  145. * 树 输入触发 搜索查询
  146. * @param query
  147. * @param cb
  148. */
  149. remoteSearch(query, cb) {
  150. if (query !== '') {
  151. let params = { organizationName: query, dimon: this.dimensionModel }
  152. getSearchData(params)
  153. .then((r) => {
  154. cb(r.resultData)
  155. })
  156. .catch((err) => {
  157. console.log(err)
  158. })
  159. } else {
  160. cb([])
  161. }
  162. },
  163. /**
  164. * @param item 搜索输入内容
  165. */
  166. treeChange(item) {
  167. // 存储 搜索输入的值
  168. if (item || item === 0) {
  169. let params = { organizationId: item.organizationId, dimon: this.dimensionModel }
  170. changeTreeData(params).then((res) => {
  171. this.treeData = res.resultData.organizationVos
  172. })
  173. }
  174. },
  175. /**
  176. * 重载树
  177. */
  178. reloadTree() {
  179. this.node.childNodes = []
  180. this.loadNode(this.node, this.resolveFunc)
  181. },
  182. },
  183. watch: {
  184. value(val) {
  185. this.reloadTree()
  186. },
  187. treeSearchInput(val) {
  188. if (val == '') {
  189. this.reloadTree()
  190. }
  191. },
  192. },
  193. }
  194. </script>
  195. <style lang="less" scoped>
  196.  
  197. </style>

希望能够帮助大家,如果哪些地方有缺陷还请大家指正。

作者:一个想留在杭州发展的撸码青年。

ElementUI Tree控件在懒加载模式下的重新加载和模糊查询的更多相关文章

  1. element-ui tree控件获取当前节点和父节点

    今天使用element-ui 遇到两个问题,第一个问题是获取tree控件的当前节点和父节点, 一开始使用tree控件的getCurrentNode()函数,结果发现返回的是当前节点的data属性,和u ...

  2. vue+element项目中使用el-dialog弹出Tree控件报错问题

    1. 按正常的点击按钮,显示dialog弹出的Tree控件,然后把该条数据下的已经选中的checkbox , 用setCheckedNodes或者setCheckedKeys方法选择上 , 报下面这个 ...

  3. 基于vue开发的element-ui树形控件报错问题解决

    对没错,这次又是ElementUI的问题,在使用ElementUI中的 tree 树形控件时需要动态添加DOM元素,但是在使用文档中给出的案例的时候会报错. 案例:ElementUI树形控件 - 自定 ...

  4. easyui中tree控件添加自定义图标icon

    来源于:http://blog.163.com/lintianhuanhai@126/blog/static/165587366201421704420256/ <!DOCTYPE html&g ...

  5. DWZ (JUI) 教程 tree 控件的选中事件

    DWZ (JUI) 教程 tree 控件的选中事件 先简单说一下流程 第一步 当然是先定义好回调事件了 function checkCallback(json){ ........... ...... ...

  6. webdynpro tree控件使用

    1.  首先创建一个TREE控件 2.  在Tree下面创建一个TREE  NODE  TYPE ,node type 是可以继续展开的,而Item type是无法展开的. 3. 创建node.,下面 ...

  7. antd的Tree控件实现点击展开功能

    antd 的 Tree 控件没有提供点击展开的功能,只能通过左边的三角形实现展开和收起,没办法只好自己实现这个功能. 先看效果 如图实现的是类似 Mac 文件目录形式的结构,有箭头代表是个文件夹,点击 ...

  8. 使用elementui树形控件写项目小结

    使用tree pagination serch table 实现功能 项目难点主要解析后台传递的代码,线性转树形,这儿加上一个大神的解析 https://blog.csdn.net/dandanzmc ...

  9. ELementUI 树形控件tree 获取子节点同时获取半选择状态的父节点ID

    使用element-ui  tree树形控件的时候,在选择一个子节点后,使用getCheckedKeys 后,发现只能返回子节点的ID,但是其父节点ID没有返回. 解决办法有三种: 1.element ...

随机推荐

  1. codeforces 1C (非原创)

    C. Ancient Berland Circus time limit per test 2 seconds memory limit per test 64 megabytes input sta ...

  2. HDU 4511 小明系列故事——女友的考验 (AC自动机 + DP)题解

    题意:从 1 走到 n,要求所走路径不能出现给定的路径,求最短路 思路:因为要求不能出现给定路径,那么我可以求助ac自动机完成判断. 我们可以在build的时候标记哪些路径不能出现,显然下面这种表示后 ...

  3. docker部署LNMP架构

    环境要求: IP hostname 192.168.1.1 node1 项目规划: 容器网段:172.16.10.0/24 NGINX:172.16.10.10 MySQL:172.16.10.20 ...

  4. vuepress & package.json lock version

    vuepress & package.json lock version npm 锁版 bug npm lock version holy shit { "name": & ...

  5. Taro 物料市场

    Taro 物料市场 taro component demo https://taro-ext.jd.com/ https://taro-ext.jd.com/plugin/view/5caab6c68 ...

  6. 近期最值得关注的潜力币种——VAST

    近期币圈的热度又再次被掀起,很多新的币种也争相上线,还有一些币种虽然还未上线,但是在币圈的火热程度也非同一般.小编留意了一下,最近在币圈讨论的最火的便是VAST代币.许多生态建设者乃至机构都表示很看好 ...

  7. Baccarat流动性挖矿的收益能否持续?该如何参与Baccarat流动性挖矿?

    2020年DeFi市场火热,众多投资机构纷纷入场,分享这场资本盛宴.然而,目前市面上大多数DeFi项目手续费高昂,小资金的投资者无法入市.为了让更多的用户参与其中,NGK推出了Baccarat流动性挖 ...

  8. CSS前端性能优化

    1.Google 资深web开发工程师Steve Souders对CSS选择器的效率从高到低做了一个排序: 1. id选择器(#myid) 2. 类选择器(.myclassname) 3. 标签选择器 ...

  9. 从微信小程序到鸿蒙js开发【13】——list加载更多&回到顶部

    鸿蒙入门指南,小白速来!从萌新到高手,怎样快速掌握鸿蒙开发?[课程入口] 目录: 1.list加载更多 2.list回到顶部 3.<从微信小程序到鸿蒙js开发>系列文章合集 1.list加 ...

  10. 面试必知:String、StringBuilder、StringBuffer的区别

    你知道String.StringBuilder.Stringbuffer的区别吗?当你创建字符串的时候,有考虑过该使用哪个吗? 别急,这篇文章带你解决这些问题. 可变性 首先,String是字符串,我 ...