1
0
mirror of https://github.com/sahadev/vue-component-creater-ui.git synced 2025-06-07 21:54:05 +08:00

fix: 增加样式渲染能力

This commit is contained in:
shangbin 2021-12-03 12:29:17 +08:00
parent 7fcb29c527
commit 936d98f03d
3 changed files with 30 additions and 3 deletions

7
package-lock.json generated
View File

@ -2297,7 +2297,7 @@
}, },
"ant-design-vue": { "ant-design-vue": {
"version": "1.7.8", "version": "1.7.8",
"resolved": "https://r.cnpmjs.org/ant-design-vue/download/ant-design-vue-1.7.8.tgz", "resolved": "https://rg.cnpmjs.org/ant-design-vue/download/ant-design-vue-1.7.8.tgz",
"integrity": "sha1-Grv4a2ik9bEAC+oEh7gDHcAAFmE=", "integrity": "sha1-Grv4a2ik9bEAC+oEh7gDHcAAFmE=",
"requires": { "requires": {
"@ant-design/icons": "^2.1.1", "@ant-design/icons": "^2.1.1",
@ -4295,6 +4295,11 @@
} }
} }
}, },
"css-scoped": {
"version": "1.0.0",
"resolved": "https://rg.cnpmjs.org/css-scoped/download/css-scoped-1.0.0.tgz",
"integrity": "sha1-pMfsm3A4bXy5o+wcw/Jsf9czjgc="
},
"css-select": { "css-select": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://r.cnpmjs.org/css-select/download/css-select-2.1.0.tgz", "resolved": "https://r.cnpmjs.org/css-select/download/css-select-2.1.0.tgz",

View File

@ -28,6 +28,7 @@
"core-js": "^3.6.4", "core-js": "^3.6.4",
"crypto-random-string": "^3.3.0", "crypto-random-string": "^3.3.0",
"css": "^3.0.0", "css": "^3.0.0",
"css-scoped": "^1.0.0",
"element-ui": "^2.15.6", "element-ui": "^2.15.6",
"escodegen": "^2.0.0", "escodegen": "^2.0.0",
"espree": "^7.3.0", "espree": "^7.3.0",

View File

@ -11,6 +11,7 @@ import { getRawComponentContent, getRawComponentKey, isObject } from '@/utils/co
import { createNewCodeGenerator } from "@/libs/code-generator-factory"; import { createNewCodeGenerator } from "@/libs/code-generator-factory";
const EventEmitter = require('eventemitter3'); const EventEmitter = require('eventemitter3');
const { cloneDeep } = require('lodash'); const { cloneDeep } = require('lodash');
import scope from 'css-scoped';
/** /**
* 主控制面板辅助类用于代码的生成与绘制 * 主控制面板辅助类用于代码的生成与绘制
@ -44,8 +45,6 @@ export class MainPanelProvider {
console.groupCollapsed('---> for code generator warn <---'); console.groupCollapsed('---> for code generator warn <---');
const readyForMoutedElement = this.createMountedElement();
// 生成原始代码 // 生成原始代码
let code = this.codeGenerator.outputVueCodeWithJsonObj(rawDataStructure); let code = this.codeGenerator.outputVueCodeWithJsonObj(rawDataStructure);
@ -61,6 +60,8 @@ export class MainPanelProvider {
const { template, script, styles, customBlocks } = parseComponent(code); const { template, script, styles, customBlocks } = parseComponent(code);
this.loadStyle(styles);
let newScript = script.content.replace(/\s*export default\s*/, "") let newScript = script.content.replace(/\s*export default\s*/, "")
const componentOptions = (new Function(`return ${newScript}`))(); const componentOptions = (new Function(`return ${newScript}`))();
@ -73,6 +74,7 @@ export class MainPanelProvider {
}; };
componentOptions.staticRenderFns = res.staticRenderFns; componentOptions.staticRenderFns = res.staticRenderFns;
const readyForMoutedElement = this.createMountedElement();
// 渲染当前代码 // 渲染当前代码
new Vue(componentOptions).$mount(readyForMoutedElement); new Vue(componentOptions).$mount(readyForMoutedElement);
@ -99,6 +101,21 @@ export class MainPanelProvider {
this.reRender(); this.reRender();
} }
loadStyle(styles) {
if (styles.length > 0) {
const scopedStyle = styles[0];
this.styleNodeName = `cssScoped${Date.now()}`;
const scopedCss = scope(scopedStyle.content.replace(/::v-deep/g, ''), this.styleNodeName);
const styleNode = document.createElement('style');
styleNode.innerText = scopedCss;
// 这个会导致越来越卡
document.head.appendChild(styleNode);
}
}
/** /**
* 初始化代码编译 * 初始化代码编译
*/ */
@ -122,6 +139,10 @@ export class MainPanelProvider {
*/ */
createMountedElement() { createMountedElement() {
const renderControlPanel = this.getControlPanelRoot(); const renderControlPanel = this.getControlPanelRoot();
if(this.styleNodeName) {
renderControlPanel.setAttribute('class', this.styleNodeName);
}
const child = document.createElement('div'); const child = document.createElement('div');
// 清空子节点 // 清空子节点