【react 和 vue】 ---- 实现组件的递归渲染

在这里插入图片描述

1. 需求场景

今天遇到了一个需求,就是 HTML 的递归渲染。问题就是商品的可用时间,使用规则等数据是后端配置,然后配置规则则是可以无限递归的往下配置,可以存在很多级。后端实现后,数据返回前端,就需要前端渲染,由于不知道在那一层结束,因此也不能使用几层循环,因为没有确定的层数,因此就出现渲染层也出现递归渲染,当然这个其实没有什么难度,主要是之前没有遇到过这种需求,因此感觉比较有趣,实现了功能,就把它记录一下。

2. 返回的数据

输入图片说明

返回数据中 children 就是可以无限往下配置的层级数据!

3. 实现效果

输入图片说明

每一层级比前一层级提行15px,样式都差不多,简化了,之前还有图标什么的,由于后端不能配置图标,所以去掉图标!

4. react 实现

  1. 由于 react 使用的是函数组件开发,这个实现就比较简单,必定函数的递归对于我们来说,都很简单,就像使用 setTimeout 实现倒计时,就是函数的递归。
4.1 实现代码
function getChildrenChildHtml(item){
    if(item?.children?.length){
      return <View>
        <View className='rui-fs26'>{item.des}</View>
        <View className='rui-ml15'>
          { item?.children?.map(getChildrenChildHtml) }
        </View>
      </View>
    }
    return <View className='rui-fs26'> 
      <Text>{item.des}</Text>
      <Text className='rui-ml15'>{item.value}</Text>
    </View>
}

说明:由于要求最后一级需要获取 value 属性的值进行展示,因此最后一级单独处理!

5. vue 实现

为什么要记录 vue 和 react 分开呢?因为移动端使用的 react,后端管理平台使用的 vue2 写的,所以也需要使用 vue 的组件再实现一次相同的逻辑。

5.1 实现代码
<template>
  <div style="font-size: 12px;line-height: 18px;">
    <div v-if="info && info.children && info.children.length">
      <div>{{info.content || info.des}}</div>
      <div v-for="(child) in info.children" :key="child.des" class="rui-ml15">
        <RuleList :info="child"/>
      </div>
    </div>
    <div v-else>
      <span>{{info.content || info.des}}</span>
      <span class="rui-ml15" v-if="info.value">{{ info.value }}</span>
    </div>
  </div>
</template>
<script>
export default {
  name: 'RuleList',
  props: {
    info: {
      type: Object,
      default: () => ({})
    }
  }
}
</script>
<style scoped>
.rui-ml15{margin-left: 15px;}
</style>
5.2 注意

输入图片说明

就是在组件内调用它自己,但是需要注意,由于我这里只是纯展示组件,没有事件的处理

5.3 返回数据

输入图片说明

5.4 实现效果

输入图片说明

6. 总结

  1. 其实实现没有什么难度,主要是之前没有遇到类似的需求,因此觉得挺有趣的,记录一下实现的过程。
  2. 我这里单纯的实现的纯展示组件,如果需要事件和其他的,就需要在处理其他的问题。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【mysql 进阶】2-1. MySQL 服务器介绍

MySQL 服务器简介 通常所说的 MySQL 服务器指的是mysqld程序&#xff0c;当运⾏mysqld后对外提供MySQL 服务&#xff0c;这个专题的内容涵盖了以下关于MySQL 服务器以及相关配置的内容&#xff0c;包括&#xff1a; 服务器⽀持的启动选项。可以在命令⾏和配置⽂件中指定这些选…

前后端请求、返回数据的多种方式

Springboot项目的业务逻辑 &#x1f319;项目基本结构&#xff1a; 通常情况下&#xff0c;我们在搭建后端项目的时候&#xff0c;处理业务逻辑我们需要用到Controller,Service,Mapper(mybatis,mybatis-plus)&#xff0c;Entry各层之间的相互调用来完成&#xff0c;还有就是我…

数据库->增删改查

目录 一、CRUD简介 二、Create新增 1.单行数据插入 2.查询 3. 多行数据插入 4.执行本机的SQL脚本插入 三、Retrieve检索 1.全列查询 2.指定列查询 3.查询字段为表达式 3.1 常量表达式 3.2列的值与常量运算 3.3列与列之间的运算 3.4为列指定别名 4.结果查询去重…

高等数学-宋浩版2.0-映射

映射&#xff1a;X,Y为非空集合&#xff0c;存在法则F,对X(原像)中每个元素X&#xff0c;按法则F&#xff0c;在Y中有唯一元素与之对应&#xff0c;F为x到Y&#xff08;镜像&#xff09;的映射。f:X->Y X原像&#xff0c;Y像&#xff0c;x定义域&#xff0c;Df,Rf &#x…

php后端学习,Java转php

遇到前后端跨域 php解决跨域问题可以加上下面的代码&#xff1a; header(“Access-Control-Allow-Origin:*”); 并且查看自己的数据库信息是否连接成功。 从Java转php 个人感受php跟偏向前端&#xff0c; 写后端逻辑时没有像java又springboot工具方便。 但是和前端联调很方便…

BUUCTF之web篇

第一题 [极客大挑战 2019]EasySQL 打开靶机后可以看到这是一个登陆的页面 我们可以尝试两种方式登录 弱口令爆破&#xff08;burpsuite&#xff09; 通过SQL注入里的万能密码来跳过账户和密码验证的过程 这里就需要万能密码aor true # 在这里单引号的作用是结束用户名或者密码…

Python基于TensorFlow实现简单循环神经网络回归模型(SimpleRNN回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后关注获取。 1.项目背景 Simple RNN是一种基础的循环神经网络&#xff0c;它能够处理序列数据&#xff0c;例如文本、时间序…

React写关键字高亮的三个方案

1.js正则replaceAlldangerouslySetInnerHTML{{ __html: xxx }}危险属性 步骤最简单,但是是危险属性,不推荐使用,项目中实在没有头绪,可以使用它应急 通过useMemo计算得到新的状态值,赋值给dangerouslySetInnerHTML属性的__html 关键代码: const [state1, setState1] useSt…

【网络原理】网络地址转换----NAT技术详解

&#x1f490;个人主页&#xff1a;初晴~ &#x1f4da;相关专栏&#xff1a;计算机网络那些事 我们在 IP协议 一文中介绍过&#xff0c;由于IPv4协议中 IP地址只有32位&#xff0c;导致最多只能表示 42亿9千万个IP地址。但我们需要通过IP地址来标识网络上的每一个设备&#x…

java核心技术点都有哪些

1. 面向对象编程&#xff08;OOP&#xff09; 核心概念&#xff1a;类、对象、继承、封装、多态。 比喻&#xff1a;面向对象编程就像是在搭建一个积木城堡。类&#xff08;Class&#xff09;是城堡的设计图纸&#xff0c;它定义了城堡的结构和功能&#xff1b;对象&#xff08…

传输层TCP

报头 1.报头和有效载荷如何分离将&#xff0c;有效载荷向上交付&#xff1f; tcp有个标准报头长度为20&#xff0c;那是不是以为我们可以像udp一样分离依靠报头大小去分离&#xff0c;我们仔细去看我们报头中还有个选项没包含到。 我们还有个首部长度&#xff0c;四位可以表…

测试代理IP的有效性和可用性

使用代理IP的有效性和可用性直接关系到用户的工作效率&#xff0c;尤其是在进行数据抓取、网络爬虫和保护个人隐私等场景中。 一、测试代理IP的必要性 代理IP的可用性测试是确保代理服务正常运行的重要步骤。测试代理IP的必要性主要体现在以下几个方面&#xff1a; 提升工作…

【Docker命令】日常使用的Docker命令

Docker常用命令 1、基础命令2、容器管理3、镜像管理推送镜像 4、网络管理5、数据管理 1、基础命令 - docker run&#xff1a;运行一个容器,--name 指定容器的名称&#xff0c;-i 获取标准输入输出&#xff0c;-t显示在终端&#xff0c;-d放到后台运行&#xff0c;--rm容器停止…

STM32传感器模块编程实践(十) 2.4G NRF24L01通信模块简介及驱动源码

文章目录 一.概要二.NRF24L01模块介绍三.NRF24L01模块主要特性四.国产射频芯片SI24R1介绍五.模块接线说明六.参考原理图七.通讯协议介绍八.STM32单片机与NRF24L01模块实现远无线通讯实验1.硬件准备2.软件工程3.软件主要代码4.实验效果 九.源代码工程下载十.小结 一.概要 NRF24…

InnoDB 存储引擎<二>页结构和行结构

目录 ⻚结构 ⾏结构 ⻚结构 ⻚在MySQL运⾏的过程中起到了⾮常重要的作⽤&#xff0c;为了能发挥更好的性能&#xff0c;可以结合⾃⼰系统的 业务场景和数据⼤⼩&#xff0c;对⻚相关的系统变量进⾏调整&#xff0c;⻚的⼤⼩就是⼀个⾮常重要的调整项 1.⻚的⼤⼩可以设置吗&…

RHCSA笔记一

常见的操作系统 UNIX 、 Linux 类、 Windows 类 搭建Linux学习环境 如何安装linux操作系统&#xff1a; 安装独立的 Linux 系统&#xff0c;不再安装其他操作系统。 安装 Windows 与 Linux 并存的多操作系统&#xff0c;启动时通过菜单选择要启动的操作系统。 在虚拟机中安…

十一、数据库配置

一、Navicat配置 这个软件需要破解 密码是&#xff1a;123456&#xff1b; 新建连接》新建数据库 创建一个表 保存出现名字设置 双击打开 把id设置为自动递增 这里就相当于每一次向数据库添加一个语句&#xff0c;会自动增长id一次 二、数据库的增删改查 1、Vs 建一个控…

探索华为云DataArts Insight:数据智能的新引擎

在快速发展的数字化时代&#xff0c;数据已经成为企业最宝贵的资产。如何有效地管理和利用这些数据&#xff0c;以实现商业价值&#xff0c;是每个企业需要面对的重要挑战。华为云DataArts Insight平台应运而生&#xff0c;作为一款强大的数据智能解决方案&#xff0c;它帮助企…

Kotlin-Annotations详解

在Kotlin中&#xff0c;注解&#xff08;Annotations&#xff09;是用于为代码提供元数据的一种机制。这些元数据可以被编译器、IDE&#xff08;集成开发环境&#xff09;或其他工具使用&#xff0c;以生成代码、执行编译时检查或提供运行时信息。 注解通常被用于类、方法、属…

算法的学习笔记—左旋转字符串(牛客JZ58)

&#x1f600;前言 在程序设计中&#xff0c;字符串处理问题屡见不鲜&#xff0c;其中“字符串左旋”是一种常见操作&#xff0c;今天我们一起来探讨一个经典的左旋转字符串题目&#xff0c;以及一种优雅的解决方案——三步翻转法。 &#x1f3e0;个人主页&#xff1a;尘觉主页…