10分钟了解Vue3递归组件的用法

目录
  • 前言
  • 用法讲解
    • 什么是递归?
    • 什么是递归组件?
    • 递归组件在哪会用到?
  • 上手实操
    • 1、创建组件
    • 2、全局注册组件
    • 3、获取导航数据
    • 4、设置递归边界,并渲染数据
  • 完整代码
  • 总结

前言

在日常 Vue 项目中,大概率会用组件库辅助开发,所以 递归组件 的出镜率可能不会非常高。但这并不代表 递归组件 不重要。

本文用10分钟左右的时间让你掌握 递归组件 的用法。

在此之前,你必须掌握:html + css + js + Vue3 基础用法,至少需要知道 Vue 组件 是什么。

用法讲解

在讲解 递归组件 之前,我们需要先了解几个概念。

什么是递归?

递归在百度百科里的定义是:

程序调用自身的编程技巧称为递归( recursion)

你可以将 递归 粗略的理解为 循环 ,只不过 递归 是调用自身。

在实际使用中,需要给递归设置一个边界条件,用该边界条件来判断是否继续递归下去。

如果不设置判断条件,将会导致 无限递归 ,也就是 死循环!

什么是递归组件?

看到这里,我相信大家是知道 Vue组件 是什么。

我先把《Vue3 递归组件 文档》 放在这。

其实 递归组件 就是把 “递归” 和 “组件” 结合起来。

组件在边界条件内不断调用自己,直到超出边界条件为止。

递归组件在哪会用到?

在我工作中会出现递归组件的情况有:

  • “树”组件:用来展示文件层级的。
  • 左侧导航栏:根据路由层级生成的导航菜单。
  • 多级表格(嵌套的表格)。

上手实操

经过前面的讲解,相信大家对 递归组件 已经有一定的概念了。

接下来通过一个简单的例子来讲解。

上图就是本次要实现的例子。

我没有写样式,大家将就一下,用想象力把这想象成网站的左侧导航栏吧。

这种导航栏,有在前端写死的;也有写业务是需要后端配置,前端把导航栏数据请求回来再生成路由的。

所以可以理解为前端一开始不知道这个导航有多少层级。

这时就可以通过 递归组件 的方式来实现。

步骤如下:

  • 创建导航组件
  • 全局注册导航组件
  • 获取数据(本例以学习为目的,所以在前端写死数据)
  • 在导航组件中设置递归边界,并渲染数据

1、创建组件

我给导航组件命名为 RootNav.vue 。并将它放在 components 目录下。

RootNav.vue

<template>
  <div>
    Rootnav
  </div>
</template>

<script setup>
</script>

<style lang="scss" scoped>
</style>

此时项目目录如下:

省略部分目录和文件

- src
|- main.js
|- App.vue
|- components
   |- RootNav.vue

2、全局注册组件

我在全局注册 RootNav.vue 组件,这样就方便 RootNav.vue 自己调用自己了。

main.js

import { createApp } from 'vue'
import App from './App.vue'
import RootNav from './components/RootNav.vue' // 引入 RootNav 组件

const app = createApp(App)
app.component('RootNav', RootNav) // 将 RootNav 注册成全局组件
app.mount('#app')

在 App.vue 中使用

App.vue

<template>
  <div>
    <RootNav />
  </div>
</template>

此时浏览器的界面如上图所示。

3、获取导航数据

在真实项目中,左侧导航可能是从后端获取的。

但本文的目的是学习递归组件,所以就直接在前端模拟了一份 “请求回来的数据”。

我把 “请求数据” 的操作放在 App.vue 。然后再通过 props 的方式传入到 RootNav.vue 组件内。

讲到 props 我就顺便提一下:《Vue3 过10种组件通讯方式》

App.vue

<template>
  <div>
    <RootNav :list="navList" />
  </div>
</template>

<script setup>
const navList = [
  {
    name: '一级导航 1'
  },
  {
    name: '一级导航 2',
    children: [
      { name: '二级导航 2-1' },
      {
        name: '二级导航 2-2',
        children: [
          { name: '三级导航 2-2-1' },
          { name: '三级导航 2-2-2' },
        ]
      },
      { name: '二级导航 2-2' }
    ]
  },
  {
    name: '一级导航 3'
  }
]
</script>

RootNav.vue

<template>
  <div>
    RootNav
  </div>
</template>

<script setup>
const props = defineProps({
  list: {
    type: Array,
    default: () => []
  }
})
</script>

此时在 RootNav.vue 里就接收到 “请求回来的导航数据” 了。

4、设置递归边界,并渲染数据

我们看到导航数据有 children 字段,这个字段是 “子菜单” 的意思。

我们可以通过是否存在 children 字段来判断是否需要继续递归。也就是说,children 就是递归的边界条件。

RootNav.vue

<template>
  <ul>
    <template v-for="item in list">
      <li>{{ item.name }}</li>
      <RootNav v-if="'children' in item" :list="item.children" />
    </template>
  </ul>
</template>

<script setup>
const props = defineProps({
  list: {
    type: Array,
    default: () => []
  }
})
</script>

这部分的重点在 HTML 代码里。

到这就完成了最开始的目标了。

完整代码

main.js

import { createApp } from 'vue'
import App from './App.vue'
import RootNav from './components/RootNav.vue'

const app = createApp(App)
app.component('RootNav', RootNav)
app.mount('#app')

App.vue

<template>
  <div>
    <RootNav :list="navList" />
  </div>
</template>

<script setup>
const navList = [
  {
    name: '一级导航 1'
  },
  {
    name: '一级导航 2',
    children: [
      { name: '二级导航 2-1' },
      {
        name: '二级导航 2-2',
        children: [
          { name: '三级导航 2-2-1' },
          { name: '三级导航 2-2-2' },
        ]
      },
      { name: '二级导航 2-2' }
    ]
  },
  {
    name: '一级导航 3'
  }
]
</script>

components/RootNav.vue

<template>
  <ul>
    <template v-for="item in list">
      <li>{{ item.name }}</li>
      <RootNav v-if="'children' in item" :list="item.children" />
    </template>
  </ul>
</template>

<script setup>
const props = defineProps({
  list: {
    type: Array,
    default: () => []
  }
})
</script>

总结

到此这篇关于Vue3递归组件的用法的文章就介绍到这了,更多相关Vue3递归组件用法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Vue.js 递归组件实现树形菜单(实例分享)

    最近看了 Vue.js 的递归组件,实现了一个最基本的树形菜单. 项目结构: main.js 作为入口,很简单: import Vue from 'vue' Vue.config.debug = true import main from './components/main.vue' new Vue({ el: '#app', render: h => h(main) }) 它引入了一个组件 main.vue: <template> <div class="tree-m

  • vuejs使用递归组件实现树形目录的方法

    上篇文章我提到了通讯录的开发,里面的目录使用了vue的递归组件实现的树形目录,这篇文章就来讲讲如何实现树形目录吧! 首先实现效果如下,觉得菜单还是比较nice的是吧: 这边数据调用的是数据库的数据的,需要数据库进行数据的构造,这里涉及到java的构造多叉树的知识,后续我会另外写一篇文章详细讲解,这里讲下前端. 数据可以先构造json使用,这里用到的格式大概如下,以childList来嵌套子菜单: { id:YH, name:银行, pid:0, childList:[{ id:YH******,

  • Vue2递归组件实现树形菜单

    今天看了老长时间递归组件,官方给的教程太简便了,根本看不出到底怎么用.于是自己查网摸索了一下,这儿只把核心思想写出来. 效果如下图,点击后打开二级菜单,再点击后打开三级. //js //引子 //思想:当v-if='false'时,循环时进行的.所以一开始就设置为false. ggg:{ name:'gs', template:` <div> <p @click.stop='show=!show'>我是p标签</p> //这儿show必须要初始值为false,不然就是堆

  • vue.js学习之递归组件

    递归组件 组件在它的模板内可以递归地调用自己,只有当它有 name 选项时才可以. 在官网这句话就是关键定义组件是一定要有name属性.按照这个思路我们开动吧. 实现最终效果图: 模拟数据格式如下: var data = [{ "id": "1", "data": { "menuName": "项目管理", "menuCode": "", }, "child

  • Vue3+TypeScript实现递归菜单组件的完整实例

    目录 前言 需求 实现 首次渲染 点击菜单项 样式区分 默认高亮 数据源变动引发的 bug 完整代码 App.vue 总结 前言 小伙伴们好久不见,最近刚入职新公司,需求排的很满,平常是实在没时间写文章了,更新频率会变得比较慢. 周末在家闲着无聊,突然小弟过来紧急求助,说是面试腾讯的时候,对方给了个 Vue 的递归菜单要求实现,回来找我复盘. 正好这周是小周,没想着出去玩,就在家写写代码吧,我看了一下需求,确实是比较复杂,需要利用好递归组件,正好趁着这 个机会总结一篇 Vue3 + TS 实现递

  • vue3递归组件封装的全过程记录

    目录 前言 1.递归组件 2.右键菜单组件 总结 前言 今天在写项目时,遇到一个自定义右键菜单的需求.在菜单中还有子菜单,所以这个时候就要用到递归组件了.所以写下这篇文章来记录一下自己编写递归组件的过程. 1.递归组件    递归组件,顾名思义就是在组件本身内部调用自身.所以我们先构建一个组件,并在自身内部调用自身.常见的递归组件就是我们项目中经常会用到的树组件了.下面就是我自己实现的一个能够满足项目需求的递归组件的源码. <template> <ul class="list-

  • 10分钟了解Vue3递归组件的用法

    目录 前言 用法讲解 什么是递归? 什么是递归组件? 递归组件在哪会用到? 上手实操 1.创建组件 2.全局注册组件 3.获取导航数据 4.设置递归边界,并渲染数据 完整代码 总结 前言 在日常 Vue 项目中,大概率会用组件库辅助开发,所以 递归组件 的出镜率可能不会非常高.但这并不代表 递归组件 不重要. 本文用10分钟左右的时间让你掌握 递归组件 的用法. 在此之前,你必须掌握:html + css + js + Vue3 基础用法,至少需要知道 Vue 组件 是什么. 用法讲解 在讲解

  • Vue两种组件类型:递归组件和动态组件的用法

    一递归组件 递归组件的特性就是可以在自己的template模板中调用自己本身.值得注意的它必须设置name属性. // 递归组件 recursive.vue <template> <div> <p>递归组件</p> <Recursion :count="count + 1" v-if="count < 3"></Recursion> </div> </template&g

  • Vue3父子组件传参有关sync修饰符的用法详解

    目录 单向数据流讲解 Vue2.x使用 定义事件的形式, 通知父组件修改 .sync 和 update: 的使用 父传子, 传递多个数据的简写 采用v-model简写(要求严格) Vue3.x使用 普通用法 简写 单向数据流讲解 单向数据流(堆可以修改,栈不可修改) 我们都知道, 父传子的数据, 是单向数据流,即子组件不能直接修改, 父组件传递过来的值 但实际上, 对于修改值, 真正是:基本数据类型不可修改,复杂数据类型不要修改引用地址(栈),它的值可以随便修改 Vue2.x使用 定义事件的形式

  • Vue2与Vue3兄弟组件通讯bus的区别及用法

    目录 vue2.x vue3.x tiny-emitter插件用法 mitt插件用法 vue2.x Vue.prototype.$bus=new Vue() 监听: this.$bus.$on('方法名',(参数)=>{}),它可以累加 触发: this.$bus.$emit('方法名',实参值) 销毁:this.$bus.$off('方法名'),谁监听谁销毁 注意: 由于监听可以累加, 所以必须要有第四步销毁 vue3.x tiny-emitter插件用法 安装插件 npm i tiny-em

  • 10分钟快速上手VueRouter4.x教程

    目录 写在前面 URL.hash与History 安装与使用流程 router-link和router-view router-link router-view 路由懒加载 动态路由 匹配所有路由 路由嵌套 写在最后 写在前面 Vue Router是Vue团队的研发的一款与Vue.js核心深度集成的一款路由插件,使Vue构建单页面程序变得非常的简单:Vue Router目前最新版本是4.X,也是Vue3推荐使用的版本,这篇文章我们就来学习一下Vue Router4.X. URL.hash与His

  • Vue递归组件+Vuex开发树形组件Tree--递归组件的简单实现

    写在前面 首先,本篇文章所开发的组件并非一个已经开源的上线组件,所以如果你急于需要一个插件来只做你的项目,那么并不能带给你及时的帮助.这个组件的开发预计写两篇文章,一遍写组件,一篇写组件逻辑.这篇文章也是我自己开发的从无到有的过程,所以它可以为你提供一些Tree组件开发的思路,代码写到一定程度,不能完全依赖插件了,有时间可以看看插件源码或者动手去开发,这样真的能加深对技术的掌握程度. 开发过程 1.数据仓库-Vuex 2.组件的循环创建-递归组件 需求决定了我的技术选型,项目需求是一个中国各级政

  • 15分钟上手vue3.0(小结)

    Vue 3 还没有正式发布,但是 Alpha 版本已经发布了. 虽然官方还不推荐在生产环境中直接使用 Vue 3 ,但是提前学习总归是有好处的. 嘴上喊着老子学不动了,双手还是很诚实的打开了 Vue 3 文档 创建项目 Vue 官方很贴心的提供了一个 github 仓库,让我们能快速体验Vue 3的新特性: git clone https://github.com/vuejs/vue-next-webpack-preview.git vue3-start cd vue3-start npm in

  • jQuery Chart图表制作组件Highcharts用法详解

    本文实例讲述了jQuery Chart图表制作组件Highcharts用法.分享给大家供大家参考,具体如下: Highcharts是一个制作图表的纯Javascript类库,主要特性如下: ① 兼容性:兼容当今所有的浏览器,包括iPhone.IE和火狐等等: ② 对个人用户完全免费: ③ 纯JS,无BS: ④ 支持大部分的图表类型:直线图,曲线图.区域图.区域曲线图.柱状图.饼装图.散布图: ⑤ 跨语言:不管是PHP.Asp.net还是Java都可以使用,它只需要三个文件:一个是Highchar

随机推荐