sunny123456

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

elementui tree组件 getNode分析
https://blog.csdn.net/CSTGxun/article/details/119885129
当我们调用getNode方法实际执行的是上图的方法,首先判断了data对象,是传入了key值还是node对象,如果传入的是一个node对象则可以直接返回数据,接着判断传入的data是不是一个对象,如果是key值就从nodesMap中找对应的数据,如果是一个对象则执行getNodeKey,这里的this指向是TreeStore,存储了一下tree的配置信息,由下图可知这里this.key传入的是一个字符串id。

在使用element-ui的tree组件时使用getNode想要获取节点,我使用了getNode()方法来获取节点,方法传入参数是node节点id,可以通过方法获取到初始化节点但是懒加载的节点获取不到,之后浏览了文档发现getNode传入的参数是key值或者节点node而不是id,节点的id是组件自动生成的(我可以通过id来获取初始化节点是因为项目中id和key值相同)。

在浏览文档之前我先看了一下element的源码,下面是部分源码分析。

源码分析:当我们调用getNode方法实际执行的是上图的方法,首先判断了data对象,是传入了key值还是node对象,如果传入的是一个node对象则可以直接返回数据,接着判断传入的data是不是一个对象,如果是key值就从nodesMap中找对应的数据,如果是一个对象则执行getNodeKey,这里的this指向是TreeStore,存储了一下tree的配置信息,由下图可知这里this.key传入的是一个字符串id。

 

getNodeKey接收了key和data,由上面可知道key是一个字符串id,如果data是一个传入的非Node的对象,如果我们在tree组件中没有设置node-key属性,这里会执行if语句直接返回data[NODE_KEY]是一个undefined的值,在getNode()方法中key接收的是一个undefined,从nodesMap中取一个undefined还是undefined,最终返回null,这也是我们在组件中调用getNode方法为什么会获取到null值的原因,如果我们传入的是对象里可以通过data['id']来获取到一个值就可以从nodesMap中获取到对应的数据。

 

demo代码:

  1. <template>
  2. <div>
  3. <!-- node-key="id"-->
  4. <el-tree
  5. ref="myTree"
  6. :load="loadNode"
  7. :data="treeData"
  8. node-key="id"
  9. lazy
  10. @node-click="handleNodeClick"
  11. show-checkbox>
  12. </el-tree>
  13. <el-button @click="getNode">获取节点</el-button>
  14. </div>
  15. </template>
  16. <script>
  17. import {treeData} from "./index.js";
  18. export default {
  19. name: "index.vue",
  20. data() {
  21. return {
  22. treeData: [],
  23. nodeId: 0,
  24. myNode: null
  25. };
  26. },
  27. mounted() {
  28. this.treeData = treeData;
  29. },
  30. methods: {
  31. handleCheckChange(data, checked, indeterminate) {
  32. console.log(data, checked, indeterminate);
  33. },
  34. handleNodeClick(data, node) {
  35. this.nodeId = node.id;
  36. this.myNode = node;
  37. console.log( node);
  38. },
  39. loadNode(node, resolve) {
  40. if (node.level === 0) {
  41. return ;
  42. // return resolve([{ name: 'region' }]);
  43. }
  44. if (node.level < 3){
  45. return resolve(node.data.children);
  46. }else {
  47. if (node.level == 3){
  48. let pomise = [
  49. {
  50. id: 1,
  51. label: '平湖街道',
  52. }
  53. ];
  54. node.data.children = pomise;
  55. resolve(pomise)
  56. }
  57. }
  58. },
  59. getNode(){
  60. console.log(this.$refs.myTree.getNode({
  61. id: 1000,
  62. label: '广东省',
  63. children: [
  64. {
  65. id: 1100,
  66. label: '深圳市',
  67. children: [
  68. {
  69. id: 1110,
  70. label: '龙岗区'
  71. }
  72. ]
  73. }
  74. ]
  75. }))
  76. }
  77. },
  78. }
  79. </script>
  80. <style scoped>
  81. </style>

js:

  1. export const treeData = [
  2. {
  3. id: 1000,
  4. label: '广东省',
  5. children: [
  6. {
  7. id: 1100,
  8. label: '深圳市',
  9. children: [
  10. {
  11. id: 1110,
  12. label: '龙岗区'
  13. }
  14. ]
  15. }
  16. ]
  17. },
  18. {
  19. id: 2000,
  20. label: '湖南省',
  21. children: [
  22. {
  23. id: 2100,
  24. label: '长沙市',
  25. children: [
  26. {
  27. id: 2110,
  28. label: 'XXX区',
  29. }
  30. ]
  31. }
  32. ]
  33. },
  34. ]

 

posted on 2022-05-08 22:37  sunny123456  阅读(1027)  评论(0编辑  收藏  举报