vue实现目录树结构

本文实例为大家分享了vue实现目录树结构的具体代码,供大家参考,具体内容如下

效果图

代码

组件部分 components/leftTree.vue

<template>
    <div>
        <ul class="all-list">
            <li v-for="(item, i) in list" :key="item.key">
            <!-- Antd的双击功能 这个看个人需求,不需要的话把'<div class="tree-item expend></div>'提取出来就可以了 -->
              <a-dropdown :trigger="['contextmenu']">
                <a-menu slot="overlay">
                  <a-menu-item key="1">
                    打开文件
                  </a-menu-item>
                  <a-menu-item key="2">
                    新建文件
                  </a-menu-item>
                  <a-menu-item key="3">
                    保存
                  </a-menu-item>
                  <a-menu-item key="4">
                    删除
                  </a-menu-item>
                </a-menu>
                <div class="tree-item expend">
                    <div
                        v-if="item.icon === 'file' || item.icon === 'openfile'"
                        class="icon-size"
                        :class="
                            openArr.includes(i) ? 'reduce-icon' : 'expend-icon'
                        "
                        @click="toggle(i)"
                    ></div>
 
                    <i v-if="item.icon === 'file'"
                        ><img src="../assets/file.png"
                    /></i>
                    <i v-if="item.icon === 'openfile'"
                        ><img src="../assets/openfile.png"
                    /></i>
                    <i v-if="item.icon === 'vue'"
                        ><img src="../assets/Vue.png"
                    /></i>
                    <i v-if="item.icon === 'js'"
                        ><img src="../assets/js.png"
                    /></i>
                    <i v-if="item.icon === 'react'"
                        ><img src="../assets/React.png"
                    /></i>
                    <i v-if="item.icon === 'sass'"
                        ><img src="../assets/Sass.png"
                    /></i>
                     <i v-if="item.icon === 'vim'"
                        ><img src="../assets/vimeo.png"
                    /></i>
                     <i v-if="item.icon === 'ts'"
                        ><img src="../assets/ts.png"
                    /></i>
                     <i v-if="item.icon === 'php'"
                        ><img src="../assets/php.png"
                    /></i>
                    <i v-if="item.icon === 'less'"
                        ><img src="../assets/less.png"
                    /></i>
                    <i v-if="item.icon === 'java'"
                        ><img src="../assets/java.png"
                    /></i>
                    <i v-if="item.icon === 'c++'"
                        ><img src="../assets/c++.png"
                    /></i>
                    <i v-if="item.icon === 'markdown'"
                        ><img src="../assets/markdown.png"
                    /></i>
                    <i v-if="item.icon === 'py'"
                        ><img src="../assets/py.png"
                    /></i>
                    <i v-if="item.icon === 'go'"
                        ><img src="../assets/go.png"
                    /></i>
                    <span class="content" @click="changeActive(item, i)">{{
                        item.title
                    }}</span>
                </div>
              </a-dropdown>
 
                <!-- 递归 -->
                <div
                    v-show="openArr.includes(i)"
                    v-if="item.children && item.children.length"
                >
                    <leftTree class="item" :list="item.children"></leftTree>
                </div>
            </li>
        </ul>
    </div>
</template>
 
<script>
export default {
    name: "leftTree",
    data() {
        return {
            openArr: [],
            checkboxIds: [],
        };
    },
    props: {
        list: {
            type: Array,
        },
    },
 
    methods: {
        toggle(i) {
            if (this.openArr.includes(i)) {
                let index = this.openArr.indexOf(i);
                this.openArr.splice(index, 1);
            } else {
                this.openArr.push(i);
            }
        },
        changeActive(item, i) {
            if (!item.children) {
                if (item.icon === "file") {
                    this.toggle(i);
                    item.icon = "openfile";
                } else if (item.icon === "openfile") {
                    this.toggle(i);
                    item.icon = "file";
                } else {
                    alert("最后一个文件");
                }
            } else {
                if (item.icon === "file") {
                    this.toggle(i);
                    item.icon = "openfile";
                } else if (item.icon === "openfile") {
                    this.toggle(i);
                    item.icon = "file";
                }
            }
        },
    },
};
</script>
<style lang='less' scoped>
i {
    line-height: 0;
    img {
      width: 16px;
      height: 16px;
    }
}
.item {
    padding-left: 4px;
}
.bold {
    font-weight: bold;
}
ul {
    line-height: 1.5em;
    list-style-type: none;
    white-space: nowrap;
    position: relative;
}
li {
    list-style-type: none;
    padding: 4px;
    user-select: none;
}
 
.tree-item {
    display: flex;
    align-items: center;
}
.expend {
    position: relative;
}
 
.expend::before {
    content: "";
    position: absolute;
    width: 6px;
    left: 9px;
    top: 10px;
    border-top: 1px dotted #c3c5c8;
}
 
.all-list::before {
    content: "";
    position: absolute;
    width: 1px;
    height: calc(100% - 40px);
    left: 48px;
    top: 20px;
    border-left: 1px dotted #c3c5c8;
}
 
.item .expend::before {
    content: "";
    position: absolute;
    width: 6px;
    left: -11px;
    top: 10px;
    border-top: 1px dotted #c3c5c8;
}
 
.item .all-list::before {
    content: "";
    position: absolute;
    width: 1px;
    height: calc(100% - 12px);
    left: 20px;
    top: 0;
    border-left: 1px dotted #c3c5c8;
}
 
.item ul {
    padding-left: 2em;
}
 
.content {
    padding-left: 4px;
    transition: all 0.2s linear;
    &:hover {
      background: #c3c5c8;
    }
}
.spacing {
    display: inline-block;
    width: 18.5px;
    height: 1em;
}
.icon-size {
    display: inline-block;
    width: 16px;
    height: 16px;
    margin-right: 4px;
}
 
.expend-icon {
    background: url("../assets/Plus.png") no-repeat center;
    background-size: cover;
    width: 9px;
    height: 9px;
}
.reduce-icon {
    background: url("../assets/minus.png") no-repeat center;
    background-size: cover;
    width: 9px;
    height: 9px;
}
 
.ant-dropdown-menu {
  width: 180px;
  background: #353b44;
  li {
    color: #fff;
    padding: 2px 10px;
    &:hover {
      background: rgb(13, 89, 175);
    }
  }
}
</style>

引用区域 views/home.vue

<template>
    <div class="home">
        <tree :list="line" />
    </div>
</template>
 
<script>
import tree from "@/components/leftTree.vue";
 
export default {
    name: "Home",
    components: {
        tree,
    },
    data() {
        return {
            line: [
                {
                    title: "Project",
                    type: 1,
                    key: "1",
                    icon: "file",
                    children: [
                        {
                            title: "index.vim",
                            key: "1-1",
                            type: 3,
                            icon: "vim",
                        },
                    ],
                },
                {
                    title: "Menu",
                    type: 1,
                    key: "2",
                    icon: "file",
                },
                {
                    title: "Components",
                    type: 1,
                    key: "3",
                    icon: "file",
                    children: [
                        {
                            title: "Index",
                            type: 2,
                            key: "3-1",
                            icon: "file",
                            children: [
                                {
                                    title: "index.vue",
                                    type: 3,
                                    key: "3-1-1",
                                    icon: "vue",
                                },
                                {
                                    title: "index.react",
                                    type: 3,
                                    key: "3-1-2",
                                    icon: "react",
                                },
                                {
                                    title: "js",
                                    type: 2,
                                    key: "3-1-3",
                                    icon: "file",
                                    children: [
                                        {
                                            title: "index.js",
                                            type: 3,
                                            key: "3-1-1-1-1",
                                            icon: "js",
                                        },
                                    ],
                                },
                                {
                                    title: "index.sass",
                                    type: 3,
                                    key: "3-1-4",
                                    icon: "sass",
                                },
                                {
                                    title: "index.less",
                                    type: 3,
                                    key: "3-1-5",
                                    icon: "less",
                                },
                            ],
                        },
                        {
                            title: "index.php",
                            type: 3,
                            key: "3-2",
                            icon: "php",
                        },
                    ],
                },
                {
                    title: "node_modules",
                    type: 1,
                    key: "4",
                    icon: "file",
                    children: [
                        {
                            title: "index.java",
                            key: "4-1",
                            type: 3,
                            icon: "java",
                        },
                        {
                            title: "index.go",
                            key: "4-2",
                            type: 3,
                            icon: "go",
                        },
                        {
                            title: "index.py",
                            key: "4-3",
                            type: 3,
                            icon: "py",
                        },
                        {
                            title: "index.c",
                            key: "4-4",
                            type: 3,
                            icon: "c++",
                        },
                        {
                            title: "README.md",
                            key: "4-5",
                            type: 3,
                            icon: "markdown",
                        },
                    ],
                },
            ],
        };
    },
};
</script>

ps: 本人是前端小白,发帖只是为了做笔记,代码可能有很多的优化空间,另外也希望可以帮助到其他有需要的朋友

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • vue-cli 目录结构详细讲解总结

    一个vue-cli的项目结构如下: 目录 结构预览 ├─build // 保存一些webpack的初始化配置,项目构建 │ ├─build.js // 生产环境构建 │ ├─check-version.js // 检查npm.node版本 │ ├─vue-loader.conf.js // webpack loader配置 │ ├─webpack.base.conf.js// webpack基础配置 │ ├─webpack.dev.conf.js // 开发环境配置,构建本地开发服务器 │ ├─

  • 浅谈Visual Studio 2019 Vue项目的目录结构

    Visual Studio 2019 Vue项目 创建成功后可看到如下结构 Visual Studio 2019配置vue项目 具体文件结构如下图 模版使用 入口文件: public/index.html   和 src/main.js 总结 到此这篇关于Visual Studio 2019 Vue项目 目录结构的文章就介绍到这了,更多相关visual studio 2019 vue项目内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

  • Vue+webpack项目配置便于维护的目录结构教程详解

    新建项目的时候创建合理的目录结构便于后期的维护是很重要 环境:vue.webpack 目录结构: 项目子目录结构 子目录结构都差不多,主要目录是在src下面操作 src目录结构 src/common 目录 主要用来存放公共的文件 src/components 主要用来存放公共的组件 src/config 用来存放配置文件,文件目录如下 src/config/index.js 配置目录入口文件 import api from './website' // 当前平台 export const HOS

  • vuex 项目结构目录及一些简单配置介绍

    首先先正经的来一段官网的"忠告": vuex需要遵守的规则: 一.应用层级的状态应该集中到单个 store 对象中. 二.提交 mutation 是更改状态的唯一方法,并且这个过程是同步的. 三.异步逻辑都应该封装到 action 里面. 文件目录结构 文件之间的关系: store文件夹 - 存放vuex的系列文件 store.js - 引入vuex,设置state状态数据,引入getter.mutation和action getter.js - 获取store内的状态 mutatio

  • vue 文件目录结构详解

    项目简介 基于 vue.js 的前端开发环境,用于前后端分离后的单页应用开发,可以在开发时使用 ES Next.scss 等最新语言特性.项目包含: 基础库: vue.js.vue-router.vuex.whatwg-fetch 编译/打包工具:webpack.babel.node-sass 单元测试工具:karma.mocha.sinon-chai 本地服务器:express 目录结构 ├── README.md 项目介绍 ├── index.html 入口页面 ├── build 构建脚本

  • 深入理解Vue-cli搭建项目后的目录结构探秘

    我最近也在研究Vue-cli的路上,今天了解一下Vue-cli目录结构,那么今天也算个学习笔记吧! 一.前言 这里先说一下使用vue-cli之前的事情. 由于刚刚接触Vue不久,就接到了一个移动端项目,于是打算使用vue来进行一次尝试,所以按照练习时候的样子,emmm先把vue.js引入网页里来,emmm自己的外联main.css样式引进来,还有自己的main.js文件,还有一些图片布拉布拉的,所以我整个项目的结构如下:(捂脸) ├── css ├── images ├── index.html

  • 基于vue-cli创建的项目的目录结构及说明介绍

    一. ├── build // 项目构建(webpack)相关代码 记忆:(够贱) 9个 │ ├── build.js // 生产环境构建代码 │ ├── check-versions.js // 检查node&npm等版本 │ ├── dev-client.js // 热加载相关 │ ├── dev-server.js // 构建本地服务器 │ ├── utils.js // 构建配置公用工具 │ ├── vue-loader.conf.js // vue加载器 │ ├── webpack.b

  • 解读vue生成的文件目录结构及说明

    利用node和npm环境我们可以很快的搭建一个vue环境.具体步骤,请看上一篇博客.搭建完成后,我们可以看到生成的文件夹中包括如下文件: 1.build文件夹是保存一些webpack的初始化配置.config文件夹保存一些项目初始化的配置. 2.node_modules是npm加载的项目依赖的模块. 3.src目录是我们要开发的目录,打开是这样的: 其中assets:用来放置图片 components:用来放组件文件 app.vue:是项目入口文件,代码如下: App.vue相当于一个组件 ma

  • vue实现目录树结构

    本文实例为大家分享了vue实现目录树结构的具体代码,供大家参考,具体内容如下 效果图 代码 组件部分 components/leftTree.vue <template>     <div>         <ul class="all-list">             <li v-for="(item, i) in list" :key="item.key">             <

  • Angular directive递归实现目录树结构代码实例

    整理文档,搜刮出一个Angular directive递归实现目录树结构代码实例代码,稍微整理精简一下做下分享. 效果图: 重点: 1. 整棵目录树的实现,通过嵌套完成,主要在于对treeItem.html的递归使用 <script type="text/ng-template" id="treeView.html"> <ul> <li ng-repeat="item in treeData.children" ng

  • asp下生成目录树结构的类

    关于生成目录树结构的类 本程序有两文件test.asp 和tree.asp 还有一些图标文件 1.test.asp 调用类生成树 代码如下 <%@ Language=VBScript %> <html> <head> <link rel="stylesheet" href="tree.css"> <title>tree</title> </head> <!-- #include

  • Django+Vue.js搭建前后端分离项目的示例

    在写这篇文章的时候,顺带学习了一下关于Markdown的使用方法. 笔者是个渣渣,一切都是自己在摸索的学着,所以也谈不上什么体系.系统学习.在这里主要是为了实现把项目前后端分离开. 这里假设你的电脑上所需的django.vue.js已经有了,如果没有,往下拉就是vue.js的安装流程.django前面写过了,就不赘述了. 一,正常搭建前后端分离项目流程 1.创建django项目 命令: django-admin startproject ulb_manager 结构: ├── manage.py

  • Vue基于NUXT的SSR详解

    本文介绍了Vue基于NUXT的SSR,分享给大家,也给自己留个笔记. SSR 首先说下 SSR,最近很热的词,意为 Server Side Rendering(服务端渲染),目的是为了解决单页面应用的 SEO 的问题,对于一般网站影响不大,但是对于论坛类,内容类网站来说是致命的,搜索引擎无法抓取页面相关内容,也就是用户搜不到此网站的相关信息. 抓取页面的前提是 html 含有被抓取内容,我们不妨看看基于 vue 的线上 SPA 页面请求时返回了什么 <!DOCTYPE html> <ht

  • vue中使用localstorage来存储页面信息

    今天小颖在跟着慕课网学习vue,不学不知道,一学吓一跳,学了才发现,我之前知道的只是vue的冰山一角,嘻嘻,今天把小颖跟着慕课网学习的demo,给大家分享下,希望对大家有所帮助嘻嘻. 环境搭建: 参考:vue API 超简单的Vue.js环境搭建教程 详情: npm install --global vue-cli  vue init webpack vue-project 然后: cd vue-project npm install    如果你配置了淘宝镜像,也可以用cnpm install

  • vue.js的手脚架vue-cli项目搭建的步骤

    手脚架是什么? 众所周知,现在的前端项目发展得越渐越大,我们前端程序员要从0开始去搭建一套完整的项目很费时,所以这时候前端工程的手脚架就出现了. 我用得vue-cli也是其中之一,还有其他的我也说不清,我就说一下我接触比较多的这款vue-cli, 但是所有手脚架的核心:都是为了能够快速搭建一个完整的项目的结构,开发者只需要在生成的项目结构的基础上进行开发即可,非常简单高效. 然后, vue-cli 的脚手架项目模板有browserify 和 webpack ,vue-lic这个手脚架是把预定义的

  • 详解vue项目构建与实战

    前言 由于vue相对来说比较平缓的学习过程和新颖的技术思路,使其受到了广大前后端开发者的青睐,同时其通俗易懂的API和数据绑定的功能也为其揽获了不少用户.本文主要讲解vue项目的构建与实战,因此不会太多涉及其API和语法部分,旨在帮助vue的入门级用户了解从零开始构建vue项目的步骤和方法. vue项目分类 首先,在构建一个vue项目之前我们需要了解vue项目的分类,这里我主要将其分为两类:(1)直接引入vue.js文件 (2)使用vue单文件组件 按以上两类来看,直接引入vue.js文件就像页

  • Python提取Linux内核源代码的目录结构实现方法

    今天用Python提取了Linux内核源代码的目录树结构,没有怎么写过脚本程序,我居然折腾了2个小时,先是如何枚举出给定目录下的所有文件和文件夹,os.walk可以实现列举,但是os.walk是只给出目录名和文件名,而没有绝对路径.使用os.path.listdir可以达到这个目的,然后是创建目录,由于当目录存在是会提示创建失败的错误,所以我先想删除所有目录,然后再创建,但是发现还是有问题,最好还是使用判断如果不存在才创建目录,存在时就不创建,贴下代码: # @This script can b

随机推荐