windows部署腾讯tmagic-editor01-Hello world

之前写过一篇使用yarn实现的https://blog.csdn.net/qq_36437991/article/details/133644558,后面的两个没有写,这次准备重新实现

环境

pnpm 8.15.1
node 18.19.0
在这里插入图片描述

创建vue项目

pnpm create vitecd hello-world
pnpm install

在这里插入图片描述
执行pnpm dev启动项目
在这里插入图片描述

安装依赖包

pnpm add @tmagic/editor @tmagic/form @tmagic/stage @tmagic/design @tmagic/element-plus-adapter element-plus

在这里插入图片描述

修改代码

注册组件

修改main.js

import 'element-plus/dist/index.css';
import '@tmagic/editor/dist/style.css';
import '@tmagic/form/dist/style.css';import { createApp } from 'vue';
import ElementPlus from 'element-plus';import TMagicDesign from '@tmagic/design';
import TMagicEditor from '@tmagic/editor';
import TMagicElementPlusAdapter from '@tmagic/element-plus-adapter';
import TMagicForm from '@tmagic/form';import App from './App.vue';createApp(App).use(ElementPlus).use(TMagicDesign, TMagicElementPlusAdapter).use(TMagicEditor).use(TMagicForm).mount('#app');

渲染编辑器

修改app.vue

<template><m-editorv-model="value":render="render":component-group-list="componentGroupList"></m-editor>
</template><script lang="ts" setup>
import { ref } from 'vue';const value = ref();const componentGroupList = ref([]);const render = () => window.document.createElement('div');
</script><style>
html,
body,
#app,
.m-editor {height: 100vh;
}body {margin: 0;
}
</style>

删除components文件夹,pnpm dev启动项目报错
在这里插入图片描述
在这里插入图片描述

修改vite.config.js

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'// https://vitejs.dev/config/
export default defineConfig({plugins: [vue()],optimizeDeps: {esbuildOptions: {define: {global: 'globalThis',},},},
})

在这里插入图片描述
重新启动项目不在报错
在这里插入图片描述
到这里一个空白的编辑器就运行起来了

添加组件列表

修改componentGroupList

const componentGroupList = ref([{title: '组件列表',items: [{icon: 'https://vfiles.gtimg.cn/vupload/20220614/9cc3091655207317835.png',text: 'HelloWorld',type: 'hello-world',},],},
]);

到这里,左侧会出现一个叫HelloWorld的爱心图标,点击它会发现没有反应,打开控制台会发现有error;这是因为还没有创建页面

点击中间的新增页面也会发现没有反应,这是因为没有编辑器初始值,只需要给value赋上初始值就可以了
在这里插入图片描述

设置编辑器初始值

修改value

const value = ref({type: 'app',// 必须加上ID,这个id可能是数据库生成的key,也可以是生成的uuidid: 1,items: [],
});

在这里插入图片描述
加上初始值后,点击新增页面就可以渲染出一个画布了,但是点击添加HelloWorld组件依然没有反应

这是因为这时的编辑器并能理解HelloWorld是什么,需要在render函数中处理

渲染

修改render

const render = () => {const root = window.document.createElement('div');const page = value.value.items[0];if (!page) return root;root.id = `${page.value.id}`;createApp({template: '<p v-for="node in config.items" :key="node.id" :id="node.id">hello world</p>',props: ['config'],},{config: page,},).mount(root);return root;
};

这里用到了动态编译Vue模板,所以需要在vue.config.js中添加vue alias,因为用的vite,所以需要修改vite.config.js

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'// https://vitejs.dev/config/
export default defineConfig({plugins: [vue()],resolve:{alias: {// 在 Vite 中,你不需要使用 `$` 来指定默认导出// 直接使用 'vue' 作为别名即可vue: 'vue/dist/vue.esm-bundler.js'}},optimizeDeps: {esbuildOptions: {define: {global: 'globalThis',},},},
})

render函数中获取page是通过value.value.items[0],这样只是表示第一个页面,如果页面有多个页面就会有问题 可以通过editorService.get(‘page’)获取到当前选中的页面

import { ref,createApp,computed } from 'vue';
import { editorService } from '@tmagic/editor';const page = computed(() => editorService.get('page'));

到这已经能渲染出HelloWorld组件了,但是会发现无法选中,因为这时并不知道画布中的Dom已经发生变化,所以需要通知编辑器,需要调用

renderer.iframe.contentWindow.magic?.onRuntimeReady({});
renderer.iframe.contentWindow.magic?.onPageElUpdate(root);

最终完整的render函数实现

import type StageCore from '@tmagic/stage';const render = async ({ renderer }: StageCore) => {const root = window.document.createElement('div');if (!page.value) return root;const { width = 375, height = 1700 } = page.value.style || {};root.id = `${page.value.id}`;root.style.cssText = `width: ${width}px;height: ${height}px;`;createApp({template: '<div v-for="node in config.items" :key="node.id" :id="node.id">hello world</div>',props: ['config'],},{config: page.value,},).mount(root);renderer.on('onload', () => {const style = window.document.createElement('style');// 隐藏滚动条,重置默认样式style.innerHTML = `body {overflow: auto;}html,body {height: 100%; margin: 0;padding: 0;}html::-webkit-scrollbar {width: 0 !important;display: none;}`;renderer.iframe?.contentDocument?.head.appendChild(style);renderer.contentWindow?.magic?.onPageElUpdate(root);renderer.contentWindow?.magic?.onRuntimeReady({});});return root;
};

在这里插入图片描述
以上就是一个简单的搭建编辑器的示例,安装上面的步骤完成后会发现,可以添加组件,也可选中组件,但是无法拖动,配置属性中的样式也无法生效,这是因为上述的render函数并不完整,没有处理dsl中style,下一节将详细介绍runtime的搭建,将不再使用render函数的方式而是使用runtimeUrl。

并不是render函数不好,但是从设计上将,render函数还是让渲染逻辑落到了编辑器中,@tmagic/editor的设计是希望做到渲染跟编辑器解耦

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

构建高效Web应用:Flask、Django和FastAPI的全面对比

构建高效Web应用&#xff1a;Flask、Django和FastAPI的全面对比 介绍Flask简介快速入门路由和视图函数模板渲染数据库操作Flask项目实战 Django简介快速入门模型和数据库视图和模板表单处理Django项目实战 FastAPI简介快速入门路径操作和参数请求和响应依赖注入FastAPI项目实战…

力扣面试经典150 —— 6-10题

力扣面试经典150题在 VScode 中安装 LeetCode 插件即可使用 VScode 刷题&#xff0c;安装 Debug LeetCode 插件可以免费 debug本文使用 python 语言解题&#xff0c;文中 “数组” 通常指 python 列表&#xff1b;文中 “指针” 通常指 python 列表索引 文章目录 6. [中等] 轮转…

Trans论文复现:考虑源荷不平衡性的微电网鲁棒定价方法程序代码!

适用平台&#xff1a;MatlabYalmipCplex/Gurobi 程序针对目前微电网中高比例新能源发电的波动性和间歇性&#xff0c;提出了考虑源荷不平衡特性的微电网鲁棒定价方法&#xff0c;综合考虑电力市场边际收益和边际成本&#xff0c;利用价格波动来平衡电源和负荷。程序算例丰富、注…

IDEA自带 .http 请求工具文档

基础语法 请求格式 基础格式 Method Request-URI HTTP-Version Header-field: Header-valueRequest-Body其中&#xff0c;GET 请求可以省略 Method 不写&#xff1b;HTTP-Version 可以省略不写&#xff0c;默认使用 1.1 版本。 示例&#xff1a; GET https://www.baidu.co…

浅谈去耦电容的作用、选择、布局及其它电容的区别!

在一些文章资料中&#xff0c;去耦电容器被认为是旁路电容器。在其他资料中&#xff0c;去耦电容和旁路电容的区别在于&#xff1a;“旁路电容以输入信号中的干扰为滤波对象&#xff0c;而去耦电容以输出信号的干扰为滤波对象&#xff0c;防止干扰信号返回到输出端。”力量。”…

[密码学]入门篇——加密方式

一、概述 加密方法主要分为两大类&#xff1a; 单钥加密&#xff08;private key cryptography&#xff09;&#xff1a;加密和解密过程都用同一套密码双钥加密&#xff08;public key cryptography&#xff09;&#xff1a;加密和解密过程用的是两套密码 历史上&#xff0c…

day37 贪心算法part6

738. 单调递增的数字 中等 提示 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈 单调递增 。 不知道怎么讲思路……以9287举例&#xff0c;…

基于Java的生活废品回收系统(Vue.js+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容三、界面展示3.1 登录注册3.2 资源类型&资源品类模块3.3 回收机构模块3.4 资源求购/出售/交易单模块3.5 客服咨询模块 四、免责说明 一、摘要 1.1 项目介绍 生活废品回收系统是可持续发展的解决方案&#xff0c;旨在鼓…

python将地理数据导出到postgis

数据格式&#xff1a; 创建test数据库 注意要选择postgis范本 执行代码 import psycopg2 from psycopg2.extras import RealDictCursor from shapely.wkt import dumps from shapely.geometry import Polygon# 数据 data [{name: a,geom:104.059962,30.647005;104.06156,30.…

TinTin DESTINATION MOON|开发者不容错过的 Web3 线下活动来啦!

还记得去年 9 月 17 日的上海吗&#xff1f;「DESTINATION MOON: Web3 Dev Summit Shanghai 2023」迎来了数百名 Web3 行业爱好者的关注和参与。4 场主题演讲、3 场圆桌讨论&#xff0c;近 20 名创新者、开发者、投资人和研究员围绕公链生态、Layer2 竞争、DID、ZKP、安全等热点…

VsCode中使用Anaconda中的python环境

1、今天在新的电脑上安装了VsCode和Anaconda&#xff0c;但是在VsCode却选择不了python的环境&#xff0c;期望结果是下面这样的 2、接着在网上百度&#xff0c;找到了方法&#xff0c;具体方法如下&#xff1a; 2.1需要先在Extensions中安装python 2.2再使用ctrlshiftP后使用…

基于PHP的音乐网站后台管理系统设计与实现

目 录 摘 要 I Abstract II 引 言 3 1 相关技术 5 1.1 PHP技术 5 1.2 MySQL技术 5 1.3ThinkPHP框架 5 1.4 Apache技术 6 1.5 本章小结 6 2系统分析 7 2.1 功能需求 7 2.2 用例分析 7 2.3系统可行性分析 9 2.4 本章小结 10 3 系统设计 11 3.1 总体设计 11 3.2 数据库设计 12 3.…