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

embedded/2024/9/23 12:51:56/

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

应用场景:

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

VUE2

javascript"><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

javascript"><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);}});});// 设置动态组件 IDthis.dynamicComponentId = DynamicComponent;}}
};
</script>

错误提示

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


http://www.ppmy.cn/embedded/97901.html

相关文章

Axios请求使用params参数导致后端获取数据嵌套

问题重述&#xff1a; 首先看前端的axios请求这里我使用params参数将data数据传给后端 let data JSON.stringify(this.posts);axios.post("/blog_war_exploded/insertPost", {params: {data: data}}).then((res) > {if (res.data "success") {alert(…

ElasticSearch 高级查询语法Query DSL实战

文章目录 1.ES高级查询Query DSL1.1 match_all1.2 术语级别查询1.3 全文检索1.4 bool query布尔查询1.5 highlight高亮 2. ES 深度分页问题及针对不同需求下的解决方案2.1 什么是深度分页2.2 深度分页会带来什么问题2.3 深度分页问题的常见解决方案2.4 总结 1.ES高级查询Query …

2025年单片机毕业设计选题物联网计算机电气电子通信类

当然&#xff0c;以下是基于物联网技术设计的20个单片机类题目&#xff0c;旨在考察学生在物联网环境下单片机应用、系统设计、数据传输与处理等方面的能力&#xff1a; 基于物联网的智能家居温度湿度控制系统设计&#xff1a;利用单片机和传感器实现室内环境的温湿度监测&…

【layUI】只能选某个特定区间的日历

要实现的功能如下&#xff1a;业务要求让日历只有近3天可选&#xff0c;其它部分变灰且不可选。 代码实现 在html中加入如下代码&#xff1a; <label class"layui-form-label" style"">日期&#xff1a; </label> <div class"layu…

Vue+SortableJs实现拖拽排序

需求说明 需求是需要首列固定、除首尾列外可进行拖动排序并保存数据 SortableJs中文地址 SortableJs 实现说明 针对首尾列固定SortableJs提供了一个配置&#xff0c;该配置虽然可实现首尾列不可拖动&#xff0c;但是在拖动其他元素到首尾列时位置仍被调换&#xff0c;所以…

网络设备net_device数据结构之ifindex

近期发现网卡index值发生改变&#xff0c;导致上层dhcp失败&#xff08;这里dhcp如果动态获取网卡index其实也无问题&#xff09;&#xff0c;这里主要来了解下网卡index值的产生原理&#xff0c;如何固定&#xff0c;如何动态注册&#xff0c;以及各自优缺点 网络设备&#x…

若依小程序使用及遇到的问题

1、首先去官网拉取小程序代码&#xff0c;从HBuildx运行到小程序 这个时候项目起来了&#xff0c;但是小程序发生了报错&#xff1b; 解决方法 在 project.config.json 新增指定 app.json 路径 ★一定要有 unpackage文件夹 如果没有的需要到HBuilder X 编译一下&#xff0c;编…

智能家居之自动加热与童锁饮水机构建思路

自动加热饮水机构建思路 引言 我们做饮水机, 并不做饮水机滤芯, 也不做饮水机的水龙头, 而是做饮水机的逻辑交互功能。 因为饮水机涉及到的人机交互可能比较多&#xff0c; 适合我们进行研究思考&#xff0c; 为其他项目的开发提供经验。 涉及到的人机交互&#xff1a; 水温控…