elementui tree组件 getNode分析


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. <script>
  2. import {treeData} from "./index.js";
  3. export default {
  4. name: "index.vue",
  5. data() {
  6. return {
  7. treeData: [],
  8. nodeId: 0,
  9. myNode: null
  10. };
  11. },
  12. mounted() {
  13. this.treeData = treeData;
  14. },
  15. methods: {
  16. handleCheckChange(data, checked, indeterminate) {
  17. console.log(data, checked, indeterminate);
  18. },
  19. handleNodeClick(data, node) {
  20. this.nodeId = node.id;
  21. this.myNode = node;
  22. console.log( node);
  23. },
  24. loadNode(node, resolve) {
  25. if (node.level === 0) {
  26. return ;
  27. // return resolve([{ name: 'region' }]);
  28. }
  29. if (node.level < 3){
  30. return resolve(node.data.children);
  31. }else {
  32. if (node.level == 3){
  33. let pomise = [
  34. {
  35. id: 1,
  36. label: '平湖街道',
  37. }
  38. ];
  39. node.data.children = pomise;
  40. resolve(pomise)
  41. }
  42. }
  43. },
  44. getNode(){
  45. console.log(this.$refs.myTree.getNode({
  46. id: 1000,
  47. label: '广东省',
  48. children: [
  49. {
  50. id: 1100,
  51. label: '深圳市',
  52. children: [
  53. {
  54. id: 1110,
  55. label: '龙岗区'
  56. }
  57. ]
  58. }
  59. ]
  60. }))
  61. }
  62. },
  63. }
  64. script>
  65. <style scoped>
  66. 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. ]