vue学习之-----组件递归调用
1、关键点

2、父组件
<template>
<div>
<div class="btn-title">
<el-button @click="addRule(ruleDataList.id)">添加父节点</el-button>
</div>
<RuleTable :pid="ruleDataList.id" :ruleData="ruleDataList.children" @delRule="delRule" @addRule="addRule"></RuleTable>
</div>
</template>
<script>
import RuleTable from './RuleTable.vue'
export default {
components: {
RuleTable
},
data() {
return {
ruleDataList: {
id: this.$nanoid(),//自定义id
lvl: 1,//节点等级
theme: '',//主题
time: '',//次数
children: []
}
}
},
methods: {
addRule(id) {
if (id === this.ruleDataList.id) {//>>>一级节点
this.ruleDataList.children.push({
id: this.$nanoid(),//自定义id
lvl: 1,//节点等级
theme: '',//主题
time: '',//次数
children: []
})
} else {
this.ruleDataList.children.map(e => {
if (e.id === id) {//>>>二级节点
let obj = JSON.parse(JSON.stringify(e))
obj.id = this.$nanoid();//自定义id
obj.lvl = 2
e.children.push(obj, {
id: this.$nanoid(),//自定义id
lvl: 2,//节点等级
theme: '',//主题
time: '',//次数
children: []
})
} else {
let flag = e.children.find(i => i.id === id)
if (flag) {//>>>三级节点
e.children.push({
id: this.$nanoid(),//自定义id
lvl: 2,//节点等级
theme: '',//主题
time: '',//次数
children: []
})
}
}
})
}
},
delRule(id) {
this.ruleDataList.children = this.ruleDataList.children.filter(i => {
// 如果是二级节点
if (i.children && i.children.length > 0) {
i.children = i.children.filter(j => {
return j.id != id
})
return i
}
// 如果是一级节点
return i.id != id
}).map(k => {
if (k.children && k.children.length === 1) {
let obj = JSON.parse(JSON.stringify(k.children[0]))
obj.lvl = 1
return obj //如果只有一个二级节点,则变为一级节点
}
return k //其余,则原样返回
})
}
}
}
</script>
<style>
.btn-title {
display: flex;
justify-content: end;
margin-bottom: 10px;
}
</style>
3、子组件RuleTable(递归调用)
<template>
<el-card style="margin-top:5px">
<el-row>
<el-col :span="2" align="center" v-if="ruleData.length > 1">
<div class="left-top" :style="'height:' + halfHeight + 'px'"></div>
<div class="left-center">组</div>
<div class="left-bottom" :style="'height:' + halfHeight + 'px'"></div>
</el-col>
<el-col :span="22" :id="pid">
<el-row v-for="item in ruleData" :key="item.id">
<RuleTable v-if="item.children.length > 0" :pid="item.id" :ruleData="item.children"
@delRule="delRule" @addRule="addRule"></RuleTable>
<el-form v-else>
<el-col :span="8" class="pd5">
<el-form-item prop="theme">
<el-input v-model="item.theme" placeholder="请输入主题"></el-input>
</el-form-item>
</el-col>
<el-col :span="8" class="pd5">
<el-form-item prop="time">
<el-input v-model="item.time" placeholder="请输入次数"></el-input>
</el-form-item>
</el-col>
<el-col :span="6" class="pd5">
<el-button type="danger" @click="delRule(item.id)">删除</el-button>
<el-button type="primary" @click="addRule(item.id)">新增</el-button>
</el-col>
</el-form>
</el-row>
</el-col>
</el-row>
</el-card>
</template>
<script>
export default {
name: 'RuleTable', //子组件的name名要和组件名一致
props: {
ruleData: {
type: Array,
default: () => []
},
pid: {
type: String,
default: () => ''
}
},
data() {
return {
halfHeight: 0,//竖线的高度
}
},
watch: {
ruleData: {
handler(val) {
console.log("ruleData--val:", val)
if (val) {
this.updateHeight()
}
},
deep: true,
immediate: true
}
}, methods: {
delRule(id) {
this.$emit('delRule', id)
},
addRule(id) {
this.$emit('addRule', id)
},
updateHeight() {
this.$nextTick(() => {
let leftHeight = document.getElementById(this.pid + '').offsetHeight
console.log("实时高度--leftHeight:", leftHeight)
this.halfHeight = (leftHeight - 21) / 2
})
}
}
}
</script>
<style>
.left-top {
width: 2px;
background-color: #bbb;
} .left-bottom {
width: 2px;
background-color: #bbb;
} .pd5 {
padding-left: 5px;
}
</style>
4、效果

vue学习之-----组件递归调用的更多相关文章
- vue学习之组件
组件从注册方式分为全局组件和局部组件. 从功能类型又可以分为偏视图表现的(presentational)和偏逻辑的(动态生成dom),推荐在前者中使用模板,在后者中使用 JSX 或渲染函数动态生成组件 ...
- 【vue】父组件主动调用子组件 /// 非父子组件传值
一 父组件主动调用子组件: 注意:在父组件使用子组件的标签上注入ref属性,例如: <div id="home"> <v-header ref="he ...
- 浅谈vue学习之组件通信
vue用组件化简化了我们编写代码的复杂度,组件之间经常会出现数据传递的情况,那么组件之间是怎样通信的呢? 使用props传递数据 组件实例的作用域是孤立的.这意味着不能 (也不应该) 在子组件的模板内 ...
- vue学习之四组件系统
vue.js既然是框架,那就不能只是简单的完成数据模板引擎的任务,它还提供了页面布局的功能.本文详细介绍使用vue.js进行页面布局的强大工具,vue.js组件系统. 一.Vue.js组件系统 每一个 ...
- vue:子组件通过调用父组件的方法的方式传参
在本案例中,由于子组件通过调用父组件的方法的方式传参,从而实现修改父组件data中的对象,所以需要啊使用$forceUpdate()进行强制刷新 父组件: provide() { return { s ...
- Vue学习之--------组件的基本使用(非单文件组件)(代码实现)(2022/7/22)
文章目录 1.为啥要使用组件 2.基本使用 3.代码实例 4.测试效果 5.注意点 1.为啥要使用组件 好用啊.像堆积木一样 2.基本使用 Vue中使用组件的三大步骤: 一.定义组件(创建组件) 二. ...
- Vue学习之组件切换及父子组件小结(八)
一.组件切换: 1.v-if与v-else方式: <!DOCTYPE html> <html lang="en"> <head> <met ...
- Vue学习之--------组件嵌套以及VueComponent的讲解(代码实现)(2022/7/23)
欢迎加入刚建立的社区:http://t.csdn.cn/Q52km 加入社区的好处: 1.专栏更加明确.便于学习 2.覆盖的知识点更多.便于发散学习 3.大家共同学习进步 3.不定时的发现金红包(不多 ...
- Vue学习笔记-组件通信-子传父(自定义事件)
props用于父组件向子组件传递数据,还有一种比较常见的是子组件传递数据或事件到父组件中.我们应该如何处理呢?这个时候,我们需要使用自定义事件来完成.什么时候需要自定义事件呢?当子组件需要向父组件传递 ...
- vue 学习一 组件生命周期
先上一张vue组件生命周期的流程图 以上就是一个组件完整的生命周期,而在组件处于每个阶段时又会提供一些周期钩子函数以便我们进行一些逻辑操作,而总体来讲 vue的组件共有8个生命周期钩子 beforeC ...
随机推荐
- HEU_KMS_Activator_v27.0.2全能系统数字许可激活工具
HEU_KMS_Activator_v27.0.2全能系统数字许可激活工具 HEU KMS Activator是KMS激活工具,支持激活 Windows XP.Windows 7.Windows 8. ...
- Docker中apt-get update失败解决方案
一.更换apt的镜像源 1. 进入目录 cd /etc/apt 2. 备份源文件 cp /etc/apt/sources.list /etc/apt/sources.list.bak 3. 更改镜像源 ...
- C++_关键字explicit
首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数 ...
- Mybatis的逆向工程与延迟加载
Mybatis 的逆向工程 Mybatis是一个半自动化的ORM框架,SQL语句需要要开发者自己定义,SQL定义在Mapper.xml中,与对应的Mapper接口对应 实体类 接口 Mapper.xm ...
- nodejs实现保存文件到本地或者服务器
nodejs如何将前端传递的文件进行保存在本地或者服务器 一.nodejs获取前端传递的文件file有三种,这里我们推荐使用koa-body 1 // 安装依赖 koa-body 2 npm inst ...
- 02Python输入输出
输入输出 print()函数 sep=' ' 数据之间一空格分割,默认是空格 end='\n' 在打印后会额外的加一个数据,默认是换行符 print("hello", " ...
- TCP/IP协议(9): UDP(User Datagram Protocol) 协议 —— 最简单的传输层协议
TCP/IP协议(9): UDP(User Datagram Protocol) 协议 -- 最简单的传输层协议 关于用户数据报协议(User Datagram Protocol, UDP)协议 UD ...
- Vue学习:实现用户没有登陆时,访问后自动跳转登录页面
设计思路 定义路由的时候配置属性,这里使用needLogin标记访问页面是否需要登录 设置路由守卫,每个页面在跳转之前都要经过验证,校验用户信息是否存在,不存在跳转到登录页 用户登录后将用户信息存储在 ...
- openfoam UPstream类探索(二)
前言 接上次的博文,本篇补全以下几个函数的介绍: Pstream::nProcs() Pstream::parRun() UPstream::exit() 简述几个常用的函数如下: Pstream:: ...
- AIR32F103(九) CAN总线的通信和ID过滤机制及实例
目录 AIR32F103(一) 合宙AIR32F103CBT6开发板上手报告 AIR32F103(二) Linux环境和LibOpenCM3项目模板 AIR32F103(三) Linux环境基于标准外 ...