vue.js树型结构实现
参考:http://www.cnblogs.com/ychl/p/6075106.html
虽然文章给出的方法可以实现树结构,使用的图标是boostrap提供的fa类别的图标。参考文献中的代码:
父组件中引入items <items :model="model" v-for="model in data"></items> 以下是items.vue的内容 <template> <li> <div @click="toggle"> <i v-if="isFolder" class="fa " :class="[open?"fa-folder-open":"fa-folder"]"></i> <!--isFolder判断是否存在子级改变图标--> <i v-if="!isFolder" class="fa fa-file-text"></i> {{model.data.menuName}} </div> <ul v-show="open" v-if="isFolder"> <items v-for="cel in model.childTreeNode" :model="cel"></items> </ul> </li> </template> <script type="text/javascript"> export default { name: "items", props: ["model"], components: {}, data() { return { open: false, isFolder: true } }, computed: { isFolder: function() { return this.model.childTreeNode && this.model.childTreeNode.length } }, methods: { toggle: function() { if(this.isFolder) { this.open = !this.open } }, } } </script>
但是如果使用的话,还需要做一些修改
1. 去掉li标签
<li style="list-style-type:none;"> <div @click="toggle"> <i v-if="isFolder" class="fa " :class="[open?"fa-folder-open":"fa-folder"]"></i> <!--isFolder判断是否存在子级改变图标--> <i v-if="!isFolder" class="fa fa-file-text"></i> {{model.data.menuName}} </div> <ul v-show="open" v-if="isFolder"> <items v-for="cel in model.childTreeNode" :model="cel"></items> </ul> </li>
2. 为了使得可以选中的子节点能够返回父控件,增加交互性,需要可以让子控件能够传递给父控件数据,但是子控件是循环嵌套的,因此需要层层上传,直到父控件。
采用:子控件像父控件传送数据
<template> <li style="list-style-type:none;"> <div @click="toggle"> <i v-if="isFolder" class="fa text-yellow" :class="[open?"fa-folder-open":"fa-folder"]" ></i> <!--isFolder判断是否存在子级改变图标--> <i v-if="!isFolder" class="fa fa-file-text text-blue" ></i> {{model.data.menuName}} </div> <ul v-show="open" v-if="isFolder"> <items v-for="cel in model.childTreeNode" :model="cel" @upup="change" :choose="choose"></items> </ul> </li> </template> <script type="text/javascript"> import $ from "jquery"; var VueRouter = require("vue-router"); export default { name: "items", props: ["model"], components: {}, data() { return { open: false, isFolder: true, choose:"" } }, computed: { isFolder: function() { return this.model.childTreeNode && this.model.childTreeNode.length } }, methods: { change(choose){ this.choose=choose; this.$emit("upup",this.choose); }, toggle: function() { this.choose=this.model.data.menuCode; this.$emit("upup",this.choose); if(this.isFolder) { this.open = !this.open } }, } } </script>
父控件调用:
template中:
<items :model="model" @upup="change" :choose="choose" v-for="model in data"></items> {{choose}}script中:
import items from "../../components/items.vue"; module.exports = { components: { items }, data: function() { return { choose:"" } methods: { change(choose){ this.choose=choose; } }
数据类型
var data = [{ "id": "1", "data": { "menuName": "项目管理", "menuCode": "", }, "childTreeNode": [{ "data": { "menuName": "项目", "menuCode": "BusProject", }, "childTreeNode": [] }, { "data": { "menuName": "我的任务", "menuCode": "BusProject", }, "childTreeNode": [] }, { "data": { "menuName": "人员周报", "menuCode": "BusProject", }, "childTreeNode": [] }] }, { "id": "2", "data": { "menuName": "数据统计", "menuCode": "BusClock", }, "childTreeNode": [] }, { "id": "3", "data": { "menuName": "人事管理", "menuCode": "", }, "childTreeNode": [] }, { "id": "4", "data": { "menuName": "基础管理", "menuCode": "", }, "childTreeNode": [] }]
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: jstree树形文件夹用vue.js组件格式做出来
- 下一篇: 开发Vue树形组件