vuejs - - - - - 递归组件的实现

news2025/1/16 20:20:05

递归组件的实现

  • 1. 需求描述:
  • 2. 效果图:
  • 3. 代码
    • 3.1 封装组件代码
    • 3.2 父组件使用

1. 需求描述:

  1. 点击添加行,增加一级目录结构
  2. 当类型为object or array时,点击右侧➕,增加子集
  3. 点击右侧🚮,删除对应子集

2. 效果图:

在这里插入图片描述

3. 代码

3.1 封装组件代码

<template>
  <template v-if="!!currentLevelData.length">
    <div class="mt10" v-for="(item, index) in currentLevelData" :key="`${deep}-${index}`">
      <div class="flex flex-align-center">
        <!-- key -->
        <div class="common mr10 border-box" :style="{ paddingLeft: (deep - 1) * 10 + 'px' }">
          <a-input v-model:value="item.key" placeholder="请输入key" />
        </div>

        <!-- type -->
        <div class="type mr10">
          <a-select
            ref="select"
            v-model:value="item.type"
            class="full-width"
            @change="handleChange($event, item)"
          >
            <a-select-option v-for="t in dataType" :value="t" :key="t">{{ t }}</a-select-option>
          </a-select>
        </div>

        <!-- value -->
        <div class="common mr10">
          <a-textarea
            :rows="1"
            placeholder="请输入参考值"
            v-model:value="item.value"
            :disabled="objectFile.includes(item.type)"
          />
        </div>

        <!-- desc -->
        <div class="common mr10">
          <a-textarea :rows="1" placeholder="请输入备注" v-model:value="item.desc" />
        </div>

        <!-- 删除按钮 -->
        <div class="flex">
          <delete-outlined class="ml5" @click="deleteTarget(index)" />
          <!-- 添加子集 -->
          <plus-outlined
            class="ml5"
            v-show="objectFile.includes(item.type)"
            @click="addSubset(item)"
          />
        </div>
      </div>

      <template v-if="!!item.child?.length">
        <!-- 组件递归 -->
        <CustomInputGroup :deep="deep + 1" :list="item.child" />
      </template>
    </div>
  </template>
</template>
<script lang="ts" setup>
import CustomInputGroup from './index.vue';
import { DeleteOutlined, PlusOutlined } from '@ant-design/icons-vue';
import { message } from 'ant-design-vue';

const dataType = ['string', 'number', 'boolean', 'object', 'array', 'file']; // 所有的类型

const props = defineProps({
  list: {
    type: Array,
    default: () => [],
  },
  deep: {
    type: Number,
    default: 1,
  },
});

const objectFile = ['object', 'array']; // 可以有下一级结构的类型

interface paramsItem {
  key: string;
  type: string;
  value: string;
  desc: string;
  child?: any;
}

// currentLevelData:永远是当前层次的数据 - 数据源来自于组件调用时传递的
// 监听props变化
const currentLevelData: any = computed(() => {
  return props.list;
});

/**
 * 切换类型
 */
function handleChange(type: string, item: any) {
  if (objectFile.includes(type)) {
    item.value = '';
    item.child = [];
  } else {
    delete item.child;
  }
}

/**
 * 添(追)加子集
 */
function addSubset(item: any) {
  const lastDeep = props.deep;
  if (lastDeep == 5) return message.info('最多支持5层结构', 2);
  item.value = '';
  item.value = '';
  item.child.push({
    key: `params${props.deep + 1}-${item.child.length + 1}`,
    type: 'string',
    value: '',
    desc: '',
  });
}

/**
 * 删除
 */
function deleteTarget(index: number) {
  currentLevelData.value.splice(index, 1);
}

/**
 * 获取数据
 */
function getChildParams() {
  return currentLevelData.value;
}
/**
 * 将子组件方法暴露给父组件
 */
defineExpose({
  addSubset,
  getChildParams,
});
</script>
<style lang="less" scoped>
.common {
  width: 135px;
}
.type {
  width: 100px !important;
}
</style>

3.2 父组件使用

<template>
	 <CustomInputGroup ref="paramRef" :list="formState.param" :deep="1" />
     <a-button class="mt10" type="primary" @click="addLineParam('param')"> 添加行 </a-button>
</template>



<script>
const formState = ({
	param:[]
})

/**
 * 添加行(headersParam、requestParam)
 */
function addLineParam(formStateKey: string) {
  formState[formStateKey].push({
    key: `params${formState[formStateKey].length + 1}`,
    type: 'string',
    value: '',
    desc: '',
  });
}
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1031546.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ETHERNET IP站转MODBUS RTU协议网

产品介绍 JM-EIP-RTU是自主研发的一款ETHERNET/IP从站功能的通讯网关。该产品主要功能是将各种MODBUS-RTU设备接入到ETHERNET/IP网络中。 JM-EIP-RTU连接到ETHERNET/IP总线中做为从站使用&#xff0c;连接到MODBUS-RTU总线中做为主站或从站使用。 产品参数 技术参数 l 网关…

leetcode:66. 加一(python3解法)

难度&#xff1a;简单 给定一个由 整数 组成的 非空 数组所表示的非负整数&#xff0c;在该数的基础上加一。 最高位数字存放在数组的首位&#xff0c; 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外&#xff0c;这个整数不会以零开头。 示例 1&#xff1a; 输入&…

【漏洞复现系列】二、weblogic-cve_2020_2883(RCE/反序列化)

Key words&#xff1a;T3协议&#xff0c;weblogic Server&#xff0c;反序列化 2.1、漏洞原理 ​cve_2020_2883 远程代码执行漏洞存在于 WebLogic Server 核心组件中,允许未经身份验证的攻击者通过 T3 协议网络访问并破坏易受攻击的 WebLogic Server&#xff0c;成功的漏洞利…

亚马逊、沃尔玛测评养号、采退需要解决防关联哪些问题?

大家好我是跨境平台测评养号七年从事经验的珑哥。养号环境软件开发&#xff0c;深度解决平台矩阵养号防关联&#xff0c;砍单&#xff0c;F号问题。 今天我给大家讲一下做亚马逊、沃尔玛测评项目需要用到的防关联、防封号环境的一些底层技术原理。这里讲的内容我相信很少有人能…

思科CCNA实验配置-视频教程

【微|信|公|众|号&#xff1a;厦门微思网络】 【微思网络www.xmws.cn&#xff0c;成立于2002年&#xff0c;专业培训21年&#xff0c;思科、华为、红帽、ORACLE、VMware等厂商认证及考试&#xff0c;以及其他认证PMP、CISP、ITIL等】 1&#xff1a; 思科CCNA实验配置——IOS基本…

vscode vue html 快捷键

css文件 选择多行 按下ctrl不放 按下鼠标滚轮不放&#xff08;鼠标中键&#xff09; 鼠标向下移动 同时修改多个相同的字符串 <style> .base-goods-item li {width: 304px;height: 404px;background-color: #eef9f4; } .base-goods-item li {display: block; } .base-…

IPEmotion 2023 R2支持快速导入MDF4文件

新发布的IPEmotion 2023 R2提供了多种新功能&#xff0c;其中一大新功能是支持快速导入MDF4文件和新的ASAM CMP标准。此外&#xff0c;现在还可用注释标记测量文件中的相关部分。 — 创新一览 — ■ 快速导入MDF4文件 • 在MDF4的导入选项中新增“加载行为”选项&#xff1a;…

【深度学习】Pytorch 系列教程(一):PyTorch数据结构:1、Tensor(张量):维度(Dimensions)、数据类型(Data Types)

目录 一、前言 二、实验环境 三、PyTorch数据结构 0、分类 1、Tensor&#xff08;张量&#xff09; 1. 维度&#xff08;Dimensions&#xff09; 0维&#xff08;标量&#xff09; 1维&#xff08;向量&#xff09; 2维&#xff08;矩阵&#xff09; 3维张量 2. 数据…

clickhouse学习之路----clickhouse的特点及安装

clickhouse学习笔记 反正都有学不完的技术&#xff0c;不如就学一学clickhouse吧 文章目录 clickhouse学习笔记clickhouse的特点1.列式存储2. DBMS 的功能3.多样化引擎4.高吞吐写入能力5.数据分区与线程级并行 clickhouse安装1.关闭防火墙2.CentOS 取消打开文件数限制3.安装依…

IDEA回滚代码

1、查看提交日志&#xff0c;选择回滚到指定提交 2、选择Hard&#xff0c;点击reset Reset Type 有三种&#xff1a; mixed 默认方式&#xff0c;只保留源码&#xff0c;回退commit和index信息 soft 回退到某个版本&#xff0c;只回退了commit的信息&#xff0c;不会恢复到in…

有效的网络带宽监控策略

世界各地的企业正在采用多种策略来减少瓶颈、增强网络性能并最大限度地提高投资回报率&#xff0c;以跟上不断发展的混合基础架构的步伐。虽然这些策略因组织而异&#xff0c;并提供了自己的好处&#xff0c;但它们可能会使 IT 基础架构的监控方式复杂化。在设计有效的监控策略…

博弈论——连续产量古诺模型

连续产量古诺模型 连续产量古诺模型是博弈论中非常经典的模型&#xff0c;以两厂商连续产量古诺博弈为例&#xff1a; 1、模型建立 Player&#xff1a;两个供应相同产品的厂商 产量&#xff1a;厂商1的产量为q1&#xff0c;厂商2的产量为q2&#xff0c;市场总供给为Qq1q2。…

【二、安装centOS】

下载 地址&#xff1a;https://mirrors.aliyun.com/centos/ 地址 1、https://mirrors.aliyun.com/centos/7.9.2009/ 2、https://mirrors.aliyun.com/centos/7.9.2009/isos/ 3、https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/ 选哪一个 可以选择第一个&#xff0…

知识图谱基本工具Neo4j使用笔记 五 :APOC插件安装及简单应用

文章目录 一、使用场景二、系统说明三、配置安装1. 插件下载2. 文件下载说明3. 版本对应4. 安装位置5. 修改配置文件6. 注意问题7. web端启动&#xff1a;测试 四、简单应用1. 编辑距离2. 基于编辑距离的相似度3. 模糊匹配 一、使用场景 APOC&#xff08;Awesome Procedures o…

等差数列和等比数列 常用公式

等差数列 定义 通项公式 &#xff0c; 公差 &#xff0c; 前n项和公式 中项公式 下标&#xff1a;mnpq&#xff0c;则 等比数列 定义 通项公式 &#xff0c; 公比 &#xff0c; 前n项和公式 &#xff0c; 中项公式 下标&#xff1a;mnpq&#xff0c;则

数据库JDBC编程

JDBC JDBC是干啥的呢&#xff1f; 简单来说就是用java代码操作数据库 各种数据库&#xff0c;在开发的时候&#xff0c;就会提供一组编程接口&#xff08;API&#xff09; API&#xff1a;Application Program Interface 简单来说就是有个软件&#xff0c;这个软件给你一些功能…

Arduino程序设计(十三)触摸按键实验(TTP223)

触摸按键实验 前言一、TTP223触摸按键模块二、触摸按键控制LED二、触摸按键状态检测 前言 本文介绍触摸按键控制LED的原理及实验&#xff0c;主要内容有&#xff1a;1、介绍TTP223触摸按键模块&#xff1b;2、触摸按键控制LED&#xff1b;3、触摸按键状态检测。 一、TTP223触摸…

竞赛选题 基于深度学习的植物识别算法 - cnn opencv python

文章目录 0 前言1 课题背景2 具体实现3 数据收集和处理3 MobileNetV2网络4 损失函数softmax 交叉熵4.1 softmax函数4.2 交叉熵损失函数 5 优化器SGD6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习的植物识别算法 ** …

腾讯云cvm云硬盘扩容

过去一直记得腾讯云的系统盘扩容,关于系统盘的扩容直接点资源调整-云硬盘扩容 系统盘扩容后就可以直接使用的&#xff1f; 但是现在操作了发现vda 200G 但是现在vda1不能自动扩容了&#xff1f; 腾讯云cvm云硬盘扩容 先看一眼官方文档吧&#xff1a;在线扩展系统盘分区及文…

全套办公软件Office 2019 mac专业版功能

Microsoft office 2019 Beta for Mac 是一款办公软件套装&#xff0c;它包含常用的办公应用程序&#xff0c;如 Word、Excel、PowerPoint 和 Outlook 等。office 2019 Beta 版本是一个测试版本&#xff0c;旨在让用户提前体验下一个版本的 office 套件&#xff0c;以便用户可以…