vue递归组件怎样用?递归组件用法总结
Admin 2021-05-24 群英技术资讯 1973 次浏览
这篇文章给大家分享的是有关vue递归组件怎么使用的内容。小编觉得挺实用的,因此分享给大家做个参考,文本有具体实例,有这方面学习需要的朋友就跟随小编一起来看看吧。
递归 相信很多同学已经不陌生了,算法中我们经常用递归来解决问题。比如经典的:从一个全为数字的数组中找出其中相加能等于目标数的组合。思路也不难,循环数组取值,不断递归相加,直到满足目标数条件。递归虽然能解决大部分,但弊处在于,很容易写出死循环的代码,导致爆栈。下面给讲讲递归在vue组件中的应用。
完成一个完整的递归,我个人认为最重要的有两点:
其中最重要的就是确定 什么时候跳出递归。递归组件实际上非常简单,就是 A组件 里再调用 A组件,就形成了一个递归。以下面我遇到的业务来说,某天接到一个需求,需要在一堆用户中根据不同标签条件组合筛选出目标用户,因此就有如下设计图:

咋一看,可能会被懵住,但其实只要经过仔细分析,发现并不是很难,看图不少同学会感觉,有点像我们常说的 套娃, 一层套一层。对于这种图,我们首要分析其中 最小单元 是哪一个,上图中很容易看出最小的是这一块。图中的大结构基本都是由这一小块组合而成,只要先实现了这块,其他无非就是通过 递归 来一层一层数据渲染。

后面的无非就是判断数据结构,如果没有子树的话,就直接简单渲染该项目。如果某项含有子树的话,就得要重新渲染这块组件,将子数据传递进去。所以思路其实非常简单,假设我们的数据结构是这样的:
{
type: 'or',
valueList: [
{
condition: '最近7天登录次数',
login: '!=',
value: 45
},
{
condition: '最近7天登录次数',
login: '!=',
value: 45
},
{
type: 'and'
valueList: [
{
condition: '最近7天登录次数',
login: '!=',
value: 45
}
]
}
]
}
上面数据结构很清晰,可以看到当数组里面的子项目包含有 valueList 时表明需要重新渲染上图所说的一小块组件。因此我们可以简单编码如下(下面代码还有可优化的地方):
<template>
<div class="label-list">
<el-tag type="primary" size="mini" class="logic">{{ typeDict[treedata.type] }}</el-tag>
<template v-for="(item, index) in treedata.valueList">
<ul v-if="!item.hasOwnProperty('valueList')" :key="'rule_' + index">
<li>{{ item.condition }} {{ item.logic }} {{ item.value }}</li>
</ul>
</template>
<template v-for="(item, index) in treedata.valueList">
<!-- 此处判断有 valuelist 因此再次调用渲染本组件 进行子项的渲染 -->
<label-shows-view v-if="item.hasOwnProperty('valueList')" :key="'tree_' + index" :treedata="item"></label-shows-view>
</template>
</div>
</template>
<script>
const _TYPE = {
'and': '且',
'or': '或'
}
export default {
name: 'LabelShowsView',
props: {
treedata: {
type: Object,
required: true
}
},
data() {
return {
typeDict: _TYPE
}
}
}
</script>
不难看出,主要是要分析找出数据结构中重复的部分,一层一层渲染下去。其实,对于上面例子是纯展示来说比较容易理解,如果加上有数据交互的话,就需要额外注意了。递归层级很深的话,事件传递、数据变更等都需要小心处理,就比如笔者在完成上述可视化配置筛选客群时就遇到了如下图的:

可以添加、删除子项,并且还可以拖拽每组进行位置的调整。这时就可以利用类似 冒泡 的方法,子组件即触发事件也接受事件。比如删除某一组条件时,需要通知父组件要删除的是子数据的哪一项,如下:
<!-- labelRulesView.vue -->
<!-- 这个自定义组件就是本组件 即递归的组件 -->
<label-rules-view v-if="item.hasOwnProperty('valueList')" :label-list="labelList" :treedata="item" :current-index="index" @delGroup="funDelGroup"></label-rules-view> <!-- 本组件监听 delGroup 事件 --> <el-button size="mini" type="danger" icon="el-icon-delete" class="operate-btn"
@click="handleDelNewGroup(currentIndex)"></el-button>
// 删除某个组
handleDelNewGroup(index) {
this.$emit('delGroup', index) // 向上层组件触发事件
},
funDelGroup(index) {
this.treedata.valueList.splice(index, 1)
},
在递归组件中,很多时候这个组件即扮演着子组件,也扮演着父组件。因此要控制好数据之间的交互,否则很容易出现数据错乱的情况
以上就是关于vue递归组件的相关介绍,当然我们也是能够完成更复杂一些的图形展示,感兴趣的朋友可以参考上文扩展实现,希望大家阅读完这篇文章能有所收获。
文本转载自脚本之家
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
今天给大家分享一道JavaScript的面试题,这道问题可是难道不少人呢。JS中我们经常会使用foreach这个方法来遍历数组,那么forEach能否跳出循环?如果能,forEach如何跳出循环?下面我们一起来探讨一下。
本文实例为大家分享了vue引入Excel表格插件的具体代码,供大家参考,具体内容如下
网页展示文字的方式有很多,将文字刻在3D图形上的你有没有看到过呢?将文字刻在3D图形上,文字能够随着图形一起运动,视觉效果呈现更酷炫。那么这是如何实现的呢?three.js是一款运行在浏览器中的3D引擎,我们能用它创建各种三维场景。因此,我们能够尝试使用three.js来复现3D动态文字效果。
Vue Router是Vue.js (opens new window)官方的路由管理器,它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌,这篇文章主要给大家介绍了关于vue3使用vue-router的相关资料,需要的朋友可以参考下
目录AJAX原理Promise封装AjaxJQ Ajax、Axios、Fetch的核心区别JQuery AjaxAxiosFetch补充:为什么要用axios?总结AJAX原理Ajax的原理简单来说是在用户和服务器之间加了—个中间层(AJAX引擎),通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008