温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Vue如何实现树形视图数据功能

发布时间:2021-05-21 11:12:43 来源:亿速云 阅读:707 作者:小新 栏目:web开发

小编给大家分享一下Vue如何实现树形视图数据功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

利用简单的树形视图实现,熟悉了组件的递归使用

这是模拟的树形图数据

let all={    name:'all',    children:{     A:{      name:'A',      children:{       a1:{        name:'a1',        children:{         a11:{           name:'a11',          children:null         },         a12:{           name:'a12',          children:null         }        }       },       a2:{        name:'a2',        children:{         b21:{           name:'b21',          children:null         }        }       }      }     },     B:{      name:'B',      children:{       b1:{        name:'b1',        children:{         b11:{           name:'b11',          children:null         },         b12:{           name:'b12',          children:null         }        }       },       b2:{        name:'b2',        children:{         b21:{           name:'b21',          children:null         }        }       }      }     }    }   }

代码如下

treelist.vue

<template>  <div>   <ul>    <li >     <span @click="isshow()">{{treelist.name}}</span>      <tree v-for="item in treelist.children"        v-if="isFolder"       v-show="open"       :treelist="item"       :keys="item"      ></tree>    </li>   </ul>  </div>  </template>  <script>  export default {   name:'tree',   props:['treelist'],   data(){    return{     open:false    }   },computed:{    isFolder:function(){     return this.treelist.children     }    }   ,methods:{    isshow(){     if (this.isFolder) {      this.open =!this.open     }    }   }  }  </script>  <style lang="less">  </style>

index.html

<!DOCTYPE html>  <html lang="en">  <head>   <meta charset="UTF-8">   <meta name="viewport" content="width=device-width, initial-scale=1.0">   <meta http-equiv="X-UA-Compatible" content="ie=edge">   <title>树形图</title>  </head>  <body>   <div id="app">    <tree :treelist="treeList"></tree>       </div>  </body>  </html>

index.js

import Vue from 'vue';  import tree from '../components/treelist.vue'  let all={    name:'all',    children:{     A:{      name:'A',      children:{       a1:{        name:'a1',        children:{         a11:{           name:'a11',          children:null         },         a12:{           name:'a12',          children:null         }        }       },       a2:{        name:'a2',        children:{         b21:{           name:'b21',          children:null         }        }       }      }     },     B:{      name:'B',      children:{       b1:{        name:'b1',        children:{         b11:{           name:'b11',          children:null         },         b12:{           name:'b12',          children:null         }        }       },       b2:{        name:'b2',        children:{         b21:{           name:'b21',          children:null         }        }       }      }     }    }   }  const app=new Vue({   el:"#app",   components:{    'tree':tree   },   data:{    treeList:all   }  })

在经过踩坑之后,我发现Vue官网有类似的案例,链接→ 传送门

参考过官网的方法后,我尝试着实现了一下

这样写和我踩坑时的 思路不同点在于, 这样一个组件只负责一个 对象,遍历每个children 中的对象,逐个传入组件处理,而我第一次尝试则是 将整个children  传入自身   是一个组件处理多个对象,(第一次尝试的失败案例,有兴趣请看最下方)

这样一个组件处理一个对象 写的好处是什么呢

我可以在组件内自定义开关了

我在data里定义了变量open,因为组件递归,所以相当于每个组件都有个属于自己的open

Vue如何实现树形视图数据功能

那为什么第一次踩坑时我不可以用这种方法呢,因为我第一次尝试 是一个组件处理多个对象 就是相当于 一个开关控制 children中的所有对象,当开关打开时会导致 这个同级的所有 对象都被展开

遍历children 挨个传入组件自身    用v-show 来控制是否显示 

Vue如何实现树形视图数据功能

定义了一个计算属性,依据children来判断是否继续执行 

Vue如何实现树形视图数据功能

在span标签上绑定了一个自定义事件

更改open 的值 

<span @click="isshow()">{{treelist.name}}</span>

Vue如何实现树形视图数据功能

实现效果

Vue如何实现树形视图数据功能

以下 是我刚开始尝试的时候踩得坑

在这里记录一下,以后遇到类似问题留个印象

首先上来就遇到了这样的报错

Vue如何实现树形视图数据功能

找了很久的问题,发现是因为组件内忘记写name了,自身使用自身必须填写name,并且与标签名一致

Vue如何实现树形视图数据功能

一开始的实现方法,利用组件递归,显示出当前级的name渲染出来,并将其中的 children 中的所有对象 传给自己然后接着执行相同操作,直到children没有数据,值得一提的是

Vue如何实现树形视图数据功能

,如果这里不加上 v-if 就会变成 死循环,就会一直执行下去,所以我们要判断一下当前执行的对象到底还有没有下一级

Vue如何实现树形视图数据功能

这里我数据有稍微的改动,所以我第一次传入的数据就是(index.html页面)

Vue如何实现树形视图数据功能

然后我定义了一个事件来处理 每一层的关闭和开启,我用弹框来查看Isopen 的值是否被改变

Vue如何实现树形视图数据功能

我们看一下结果

刚进入页面时,括号中的undefined是 Isopen 当前的值,因为此时未被定义,所以为undefined

Vue如何实现树形视图数据功能

然后我点击了A

Vue如何实现树形视图数据功能

因为此时isopen已被反转值,所以此时isopen为true

Vue如何实现树形视图数据功能

但是页面仍毫无变化,不说展开功能,就连undefined也没变化

Vue如何实现树形视图数据功能

经过一番百度 ,发现原来是vue本身已经不允许这样直接更改 Props接受过来的值了

vue是什么

Vue是一套用于构建用户界面的渐进式JavaScript框架,Vue与其它大型框架的区别是,使用Vue可以自底向上逐层应用,其核心库只关注视图层,方便与第三方库和项目整合,且使用Vue可以采用单文件组件和Vue生态系统支持的库开发复杂的单页应用。

以上是“Vue如何实现树形视图数据功能”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

vue
AI