将.js文件转成vue标签结构的样式

news2024/11/28 5:52:00

例如:下图所示:

依次识别获取.js文件中的tagprops,可以理解为字符串拼接,将整个vue的标签结构看作是一个字符串。

话不多说,先放上完整代码,思路看代码备注。(自己实现的时候,可以先把tag标签,即vue结构弄出来,后续再加上props属性,这样思路会更加清晰)

实现方法:

首先想到的是利用递归,一点一点的拼接字符串,因为.js文件到底多大是不确定的。

data() {
    return {
      previewContent: '',
      suojinStr: ''// 获取缩进字符
    }
  },
 methods: {
    handlePreview() {
      var jsdata = require('../../../public/js/bbb.js') //获取文件
      this.obtainData(jsdata.default) //调用递归方法
      this.previewContent = '<template>' + this.previewContent + '\n' + '</template>'
    },
    obtainData(data) {
      var children = data.children
      if (children) {
        this.suojinStr += '\t'
        for (var i = 0; i < children.length; i++) {
          // 拼接字符串:换行符+缩进+开始标签
          this.previewContent += '\n' + this.suojinStr + '<' + children[i].tag + '>'
            
          // 获取props相关数据---放在开始标签的里面--比开始标签在往里缩进一格
          if (children[i].props !== undefined) {
            for (var key in children[i].props) {
              // 拼接字符串:换行符+缩进+(再一格缩进)+props的内容
              this.previewContent += '\n' + this.suojinStr + '\t' + key + '=' + '"' + children[i].props[key] + '"'
            }
          }
            
          // 调用自身,递归---挖掘孩子节点,一层一层拼接
          this.obtainData(children[i])
          
          // 拼接字符串:换行符+缩进+结束标签---当没有孩子时,闭合标签
          this.previewContent += '\n' + this.suojinStr + '</' + children[i].tag + '>'
        }
        // 结束标签的空格回退---父亲的结束标签和和父亲的开始标签对齐,所以等没有孩子时,回退一格缩进
        this.suojinStr = this.suojinStr.substr(1)
      }
    }
  }

后面,和Sweny-blog讨论了一下,发现她的字符串是整个拼接起来的,不像我拼接的这么零碎。然后我也尝试了一下拼接完整版。

methods: {
    handlePreview() {
      var jsdata = require('../../../public/js/bbb.js')
      this.previewContent = this.obtainData1(jsdata.default)
      this.previewContent = '<template>' + this.previewContent + '\n' + '</template>'
    },
    obtainData1(data) {
      // 换行+缩进+首标签+递归(找孩子)+换行+缩进+尾标签
      var previewContent = ''
      var children = data.children
      if (children) {
        this.suojinStr += '\t'
        for (var i = 0; i < children.length; i++) {
          
          // 获取props属性的值---这块可以写成一个函数,后面完整拼接的时候,直接调用就行了
          var propsStr = ''
          if (children[i].props !== undefined) {
            for (var key in children[i].props) {
              propsStr += '\n' + this.suojinStr + '\t' + key + '=' + '"' + children[i].props[key] + '"'
            }
          }
          // 完整的拼接
          previewContent += '\n' + this.suojinStr + '<' + children[i].tag + '>' + propsStr + this.obtainData1(children[i]) + '\n' + this.suojinStr + '</' + children[i].tag + '>'
        }
        // 结束标签的空格回退
        this.suojinStr = this.suojinStr.substr(1)
      }
      return previewContent
    },
  }

这里面用到了previewContent这个局部变量进行拼接

为什么要使用局部变量?不像之前使用全局变量?

因为,拼接字符串中,调用了this.obtainData1(children[i])获取孩子拼接的字符串。若是全局变量,没有清空的过程,它会累加多余的字符。这里涉及到的知识点是变量作用域。

下面简单写个相似的递归:

function test1(num){
    var str = ''
    console.log('外面的str:'+ str)
    num++
    if(num<5){
        str+='a'+test1(num)
        console.log('if里面的str:'+ str)
    }
    return str;
}

test1(0);

依次输出:

递归的过程是一层一层调用函数,每调用一个函数,又重新声明赋值了变量str,这就相当于子函数重新生成了一个同名变量,操作的是自己的变量。这个return str,是每次递归调用子函数,子函数返回的字符串,一层一层的累加。

其实相当于:先走到最内层,然后从最内层一层一层往外加str。

再看一个var变量作用域的示例:

var a = 1
function test4(){
    var a= 2;
    console.log(a)
}

console.log(a) // 输出:1
test4();       // 输出:2
console.log(a) // 输出:1

若是还不懂,之前发过一篇博客JS中变量(var、let、const)的声明提升和作用域梳理专门讲作用域的,可以看看。

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

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

相关文章

string的深浅拷贝问题

深浅拷贝问题引入浅拷贝深拷贝总结问题引入 对于一个普通的string类&#xff1a; class String { public:String(const char* str ""){//构造函数if (nullptr str)str "";_str new char[strlen(str) 1];strcpy(_str, str);}~String(){//析构函数if …

CSGO搬砖项目,23年最适合小白的项目!

大家好&#xff0c;我是阿阳 不懂的小伙伴&#xff0c;咱继续听我娓娓道来 steam搬砖主要涉及的是csgo游戏平台装备的一个搬运&#xff0c;比较很好理解&#xff0c;主要就是道具的搬运工&#xff0c;简单来讲就是&#xff0c;从国外steam游戏平台购买装备&#xff0c;再挂到…

几种实现主题切换的方式

几种实现主题切换的方式 1. 利用 prefers-color-scheme 特性 prefers-color-scheme是CSS 媒体特性【media】用于检测用户是否有将操作系统的主题色设置为亮色【light】或者暗色【dark】。 当前prefers-color-scheme新特性支持各大主流电脑&#xff08;window和IOS系统&#…

今天面试招了个18K的人,从腾讯出来的果然都有两把刷子···

公司前段时间缺人&#xff0c;也面了不少测试&#xff0c;前面一开始瞄准的就是中级的水准&#xff0c;也没指望来大牛&#xff0c;提供的薪资在15-20k&#xff0c;面试的人很多&#xff0c;但平均水平很让人失望。看简历很多都是4年工作经验&#xff0c;但面试中&#xff0c;不…

Jenkins使用(代码拉取->编译构建->部署上线)

Jenkins简介 Jenkins是一个开源项目&#xff0c;提供了一种易于使用的持续集成系统&#xff0c;使开发者从繁杂的集成中解脱出来&#xff0c;专注于更重要的业务逻辑实现上。同时Jenkins能实时监控集成中存在的错误&#xff0c;提供详细的日志文件和提醒功能&#xff0c;还能用…

HRMS有什么特点?

当今企业的发展离不开技术支持&#xff0c;同样&#xff0c;在管理方面也需要与时俱进&#xff0c;进行数字化转型。人力资源技术的运用是企业管理数字换转型的重要表现之一。在企业选择一款HR软件之前&#xff0c;应该先认识到&#xff0c;什么是人力资源管理软件——即HRMS。…

midjournery AI绘画使用指南

midjournery AI绘画使用指南 基于Discord的Midjournery配置&#xff1a; https://www.bilibili.com/video/BV16d4y1A7Zq/?spm_id_from333.337.search-card.all.click&vd_source9c3ca9555620bed64bdee27ae49d37cf 使用原则 使用midjournery绘画的原则是给出对脑海中某个…

golang rabbitMQ 生产者复用channel以及生产者组分发策略

引用的是rabbitMQ官方示例的库&#xff1a;github.com/rabbitmq/amqp091-go在网络编程中我们知道tcp连接的创建、交互、销毁等相关操作的"代价"都是很高的&#xff0c;所以就要去实现如何复用这些连接&#xff0c;并要做到高效并可靠。预期效果&#xff1a;项目初始化…

论如何用python自动下载爱的妹子视频~嘿嘿嘿~

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ 现在好看的妹子真的太多啦~ 如何一次性把这些好看的视频全保存下来捏&#xff1f; 开发环境: 版 本: python 3.8 编辑器: pycharm 2022.3.2 专业版 requests >>> pip install request…

【数据结构】复杂度讲解

目录 时间复杂度与空间复杂度&#xff1a;&#xff1a; 1.算法效率 2.时间复杂度 3.空间复杂度 4.常见时间复杂度以及复杂度OJ练习 时间复杂度与空间复杂度&#xff1a;&#xff1a; 什么是数据结构? 数据结构中是计算机存储,组织数据的方式,指相互之间存在一种或多种特定关…

面向对象的设计模式

"万丈高楼平地起&#xff0c;7种模式打地基"&#xff0c;模式是一种规范&#xff0c;我们应该站在巨人的肩膀上越看越远&#xff0c;接下来&#xff0c;让我们去仔细了解了解面向对象的7种设计模式7种设计模式设计原则的核心思想&#xff1a;找出应用中可能需要变化之…

24考研|高等数学的基础概念定理(二)——第二章|导数与微分

文章目录一、基础概念定理部分1.1 导数的四则运算法则1.2 反函数的求导法则1.3 复合函数的求导法则1.4 费马引理1.5 罗尔定理1.6 拉格朗日中值定理1.7 导数为零的结论1.8 柯西中值定理1.9 洛必达法则1.10 泰勒中值定理&#xff08;定理1&#xff0c;定理2&#xff09;1.11 导数…

CRM系统能给企业带来什么? CRM系统推荐

什么是CRM系统&#xff1f; CRM系统&#xff08;又称客户关系管理系统&#xff09;是一个以客户为核心的管理软件&#xff0c;能有效改善企业与现有客户的关系&#xff0c;且帮助企业寻找新的潜在客户&#xff0c;并赢回以前老客户。 CRM系统能给企业带来什么&#xff1f; C…

计算机视觉框架OpenMMLab开源学习(五):目标检测实战

目标检测实战 前言&#xff1a;本篇主要偏向目标检测实战部分&#xff0c;使用MMDetection工具进行代码应用&#xff0c;最后对水果进行检测实战演示&#xff0c;本次环境和代码配置部分省略&#xff0c;具体内容建议参考前一篇文章&#xff1a;计算机视觉框架OpenMMLab开源学…

基于STM32设计的避障寻迹小车

一、前言 1.1 项目背景 根据美国玩具协会在一项研究中&#xff0c;过去几年全球玩具销售增长与GDP的世界平均水平大致相同。但全球玩具市场的内部结构已经占据了巨大的位置变化&#xff1a;传统玩具的市场份额正在下降&#xff0c;高科技电子玩具正在蓬勃发展。全球玩具市场的…

迁移至其他美国主机商时需要考虑的因素

网站的可访问性是关系业务的关键因素之一。一个稳定、快速且优化良好的主机上的网站更有可能享受不间断的流量&#xff0c;并在谷歌的SERP中获得更好的排名。因此&#xff0c;在构建企业网站时&#xff0c;选择合适的主机商相当重要。不过就以美国主机为例&#xff0c;由于每个…

three.js学习笔记(一):THREE.Materail五种基础材质的使用

MeshBasicMaterial&#xff08;网格基础材质&#xff09;&#xff1a;基础材质&#xff0c;用于给几何体赋予一种简单的颜色&#xff0c;或者显示几何体的线框。MeshDepthMaterial&#xff08;网格深度材质&#xff09;&#xff1a; 这个材质使用从摄像机到网格的距离来决定如何…

企业舆情监测多少钱,TOOM舆情监测专业服务平台

企业舆情监测的费用因公司不同而异&#xff0c;具体需要多少钱取决于您的需求和舆情监测公司的收费标准。一些因素&#xff0c;如舆情监测范围、数据收集方式、舆情分析报告等细节&#xff0c;都可能影响最终的费用。最好联系舆情监测公司询问具体收费标准。企业舆情监测多少钱…

Linux_用户和权限

一、认识root用户 --超级管理员 root用户拥有最大的系统操作权限&#xff0c;而普通用户在许多地方都是受限的 普通用户的权限&#xff0c;一般在其home目录内是不受限的 一旦出了home目录&#xff0c;大多数地方普通用户仅有只读和执行权限&#xff0c;无修改权限 1、su和…

linux配置密码过期的安全策略(/etc/login.defs的解读)

长期不更换密码很容易导致密码被破解&#xff0c;而linux的密码过期安全策略主要在/etc/login.defs中配置。一、/etc/login.defs文件的参数解读1、/etc/login.defs文件的内容示例[rootlocalhost ~]# cat /etc/login.defs # # Please note that the parameters in this configur…