【前端】VUE动态引入组件 通过字符串动态渲染模板 动态生成组件

【前端】VUE动态引入组件 通过字符串动态渲染模板

应用场景:

js增强 动态代码 扩展一类的  可以配合低代码平台等  灵活配置在线表单  在线列表等 适合灵活性 扩展性比较强的组件

VUE2

<template>
  <div>
    <textarea v-model="templateString"></textarea>
    <div>
      <component :is="component"></component>
    </div>
  </div>
</template>

<script>
import Vue from 'vue';

//这里如果之前全局引用过 则不用再引用
import Antd from 'ant-design-vue';
//这里如果之前全局引用过 则不用再引用
import 'ant-design-vue/dist/antd.css';

Vue.use(Antd);

export default {
  data() {
    return {
      templateString: `
        <div>
          <h1> message </h1>
          <button>Change Message</button>
            <a-progress :percent="30" />
            <a-progress :percent="50" status="active" />
            <a-progress :percent="70" status="exception" />
            <a-progress :percent="100" />
            <a-progress :percent="50" :show-info="false" />
          </div>
      `,
      component: null
    };
  },
  watch: {
    templateString(newTemplate) {
      if (newTemplate) {
        console.log('渲染', newTemplate)
        this.createDynamicComponent(newTemplate);
      }
    }
  },
  methods: {
    createDynamicComponent(templateString) {

      // 使用 Vue.component 创建动态组件
      this.component = Vue.component('dynamic-component', {
        template: templateString
      });


    },
  }
};
</script>

使用带编译器的 Vue 版本

你可以使用包含模板编译器的 Vue 版本,它支持直接编译模板字符串。你需要在 vue.config.js 中指定这一点:

module.exports = { runtimeCompiler: true };

这样你就可以使用包含编译器的 Vue 版本,并且可以动态编译模板字符串。

VUE3

<template>
  <div>
    <textarea v-model="templateString"></textarea>
    <div>
      <dynamic-component :is="dynamicComponentId"></dynamic-component>
    </div>
  </div>
</template>

<script>
import { defineAsyncComponent } from "vue";

export default {
  data() {
    return {
      templateString: `
        <template>
          <div>
            <h1>{{ message }}</h1>
            <button @click="changeMessage">Change Message</button>
          </div>
        </template>
        
        <script>
        export default {
          data() {
            return {
              message: "Hello from dynamic component!"
            };
          },
          methods: {
            changeMessage() {
              this.message = "Message changed!";
            }
          }
        };
        </script>
      `,
      dynamicComponentId: null
    };
  },
  watch: {
    templateString(newTemplate) {
      if (newTemplate) {
        this.createDynamicComponent(newTemplate);
      }
    }
  },
  methods: {
    createDynamicComponent(templateString) {
      const DynamicComponent = defineAsyncComponent(() => {
        return new Promise((resolve, reject) => {
          try {
            // 解析模板字符串为组件定义
            const componentDefinition = JSON.parse(
              JSON.stringify({
                template: templateString,
                data: () => ({
                  message: "Initial message"
                })
              })
            );
            
            resolve(componentDefinition);
          } catch (error) {
            console.error("Error parsing template string:", error);
            reject(error);
          }
        });
      });

      // 设置动态组件 ID
      this.dynamicComponentId = DynamicComponent;
    }
  }
};
</script>

错误提示

"export 'defineAsyncComponent' was not found in 'vue'
需要使用VUE3

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

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

相关文章

开源版最新LoveCardsV2表白墙源码下载

源码亮点 模板系统&#xff0c;给你无限可能 卡片不限字数&#xff0c;支持多图片上传 支持评论&#xff0c;点赞&#xff0c;让互动性拉满 管理后台可添加多个管理员 卡片一键分享至多平台 卡片浏览次数统计 发行版开箱即用 部署教程 1. 环境&#xff08;参考开发环境&…

git-版本管理工具基本操作-创建仓库-拉取-推送-暂存库-版本库

1、创建仓库 2、克隆仓库到本地&#xff08;首次拉取需要输入用户名和密码&#xff0c;用户名用邮箱&#xff0c;密码用登录gitee的密码&#xff0c;后面配置密钥后可以直接clone&#xff09; 在命令行输出两行指令配置git才能克隆&#xff1a; username&#xff1a;gitee账号…

快速排序(Java实现)

目录 快速排序的思想 代码实现 思路 代码 快速排序的特点 快速排序的思想 快速排序和冒泡排序一样&#xff0c;是一种交换排序。快速排序的核心思想也是分治&#xff0c;分而治之。给定一个数组&#xff0c;先选定一个元素作为枢轴&#xff0c;然后将大于枢轴的放在右边&a…

成为Python砖家(3): 何时产生字节码 .pyc 文件

好奇&#xff1a;.pyc和 __pycache__是啥&#xff1f; 你是否好奇&#xff0c;在某些 Python 工程中&#xff0c;当执行了 xxx.py脚本后&#xff0c;多出了 __pycache__目录&#xff1f;这个目录下存放的是一些 .pyc结尾的文件。 这些文件&#xff0c;叫做 python bytecode。 …

开源免费的表单收集系统TDuck

TDuck&#xff08;填鸭表单&#xff09;是一款开源免费的表单收集系统&#xff0c;它基于Apache 2.0协议开源&#xff0c;用户可以随时下载源码&#xff0c;自由修改和定制&#xff0c;也可以参与到项目的贡献和反馈中。TDuck表单系统不仅支持私有化部署&#xff0c;还提供了丰…

【IEEE独立出版】第四届人工智能、虚拟现实与可视化国际学术会议(AIVRV 2024)

第四届人工智能、虚拟现实与可视化国际学术会议&#xff08;AIVRV 2024&#xff09; 2024 4th International Conference on Artificial Intelligence, Virtual Reality and Visualization 会议时间&#xff1a;2024年11月1日-3日 会议地点&#xff1a;中国-南京…

在亚马逊云科技上提取视频内容并利用AI大模型开发视频内容问答服务

项目简介&#xff1a; 小李哥将继续每天介绍一个基于亚马逊云科技AWS云计算平台的全球前沿AI技术解决方案&#xff0c;帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS AI最佳实践&#xff0c;并应用到自己的日常工作里。 本次介绍的是如何在亚马逊云科技上利用音视…

langchian 批次调用 prompt

目录 基础不使用批次 batch 批次调用 关于 langchian 额一些应用&#xff0c;可以查看案例&#xff1a; GitHub - 5zjk5/prompt-engineering: prompt 工程项目案例 基础不使用批次 from dotenv import load_dotenv import time import os from langchain_core.prompts imp…

Image-coloring的部署,在Ubuntu22.04系统下——点动科技

一、ubuntu22.04基本环境配置 1.1 更换清华Ubuntu镜像源 删除原来的文件 rm /etc/apt/sources.list开始编辑新文件 vim /etc/apt/sources.list先按i键&#xff0c;粘贴以下内容 # 默认注释了源码镜像以提高 apt update 速度&#xff0c;如有需要可自行取消注释 deb https:…

【体检】程序人生之健康检查,全身体检与预防疫苗,五大传染病普筛,基因检测等

程序员养生指南之 【体检】程序人生之健康检查&#xff0c;全身体检项目分类&#xff0c;五大传染病普筛&#xff0c;基因检测等 文章目录 一、全身体检与预防疫苗&#xff08;年检&#xff09;1、实验室检测&#xff1a;生化全套检查2、医技检查&#xff1a;辅助诊疗科室3、科…

【学习笔记】多元线性回归模型 —— Matlab

文章目录 前言一、多元线性回归多元线性回归模型线性模型 ( Y , X β , σ 2 I n ) (Y,X\beta,\sigma^2I_n) (Y,Xβ,σ2In​) 考虑的主要问题多元线性回归模型的参数估计多元线性回归模型和回归系数的检验 二、示例三、代码实现----Matlab1.多元回归的实现2.逐步回归的实现3.M…

MES系统:智能化排班排产的全面解决方案

MES&#xff08;制造执行系统&#xff09;管理系统通过集成多种先进技术、实时数据采集与分析、优化算法应用以及与其他系统的协同工作&#xff0c;实现了智能化排班排产功能。以下是该功能的详细实现方式&#xff1a; 数据集成与实时采集&#xff1a;MES系统与ERP、SCM、设备管…

Linux常用命令 ---- rmdir 命令[删除一个空目录]

rmdir 命令 功能&#xff1a;删除一个空目录 我们使用 mkdir 命令创建一个名为 test 空文件夹&#xff0c;如下图所示。 现在使用 rmdir 命令将 test 文件夹进行删除&#xff0c;如下图所示。 注意&#xff1a;rmdir 命令只能删除一个空目录&#xff0c;如果这个目录中有其他文…

python从入门到精通:函数

目录 1、函数介绍 2、函数的定义 3、函数的传入参数 4、函数的返回值 5、函数说明文档 6、函数的嵌套调用 7、变量的作用域 1、函数介绍 函数是组织好的&#xff0c;可重复使用的&#xff0c;用来实现特定功能的代码段。 name "zhangsan"; length len(nam…

【面试题系列Vue02】Vue Router 路由都有哪些模式?各模式之间有什么区别?

官方解析 Vue Router 路由有三种模式&#xff1a; hash 模式&#xff1a;使⽤ URL 中的 hash&#xff08;即 # 后面的内容&#xff09;来作为路由路径。 在这种模式下&#xff0c;页面不会重新加载&#xff0c;只会更新 hash 值&#xff0c;并触发路由变化&#xff0c;从而渲…

什么是机器人快换盘?

机器人快换盘&#xff0c;行业内也称作工具快换盘、换枪盘、快换工具盘、快速更换器、快换器、 快换夹具、治具快换等。是末端执行器快速更换装置&#xff08;End-Of-Arm Tooling&#xff0c;简称EOAT&#xff09;&#xff0c;是工业自动化领域中用于机器人手臂上的一种重要设备…

【Python零基础】while循环和用户输入

文章目录 前言一、input()函数二、while循环三、使用while循环来处理列表和字典总结 前言 我们开发一个应用程序&#xff0c;目的都是为了解决最终用户的问题&#xff0c;针对用户界面输入的数据&#xff0c;按照用户期待的逻辑进行处理&#xff0c;得到用户想要的结果。本章将…

如何在前端测试中,在F12中加入token

不止是token&#xff0c;cookie中其他的数据也都可以这样 首先打开F12&#xff0c;然后找到Application或者应用程序 然后找到cookie里面双击这里&#xff0c;输入token或者其他数据就可以了&#xff0c;后面输值。

高性能日志系统

目录 设计思路 架构设计 设计模式应用 单例模式 工厂模式 建造者模式 代理模式 异步处理设计 异步日志器使用原因 异步日志器设计思路 异步日志器实现的核心模块说明 性能优化以及问题解决 测试结果 双缓冲区机制设计 设计思路及其架构 生产消费模式与双缓冲区结…

C++ wxWidgets图形界面开发用什么IDE最好?

在主流免费的IDE工具中&#xff0c;我们可以想到的支持cmake项目的工具就只有QtCreator&#xff0c;VisualStudio&#xff0c;VSCode这三个。其中QtCreator和VSCode支持WIndows&#xff0c;Mac&#xff0c;WIndows三大主流平台。但是VSCode在Ubuntu等系统下的支持并没有在WIndo…