console
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Element UI Online Editor</title>
<link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
<script src="https://unpkg.com/vue@2/dist/vue.js">
</script>
<script src="https://unpkg.com/element-ui/lib/index.js">
</script>
<style>
.container {
padding: 20px;
height: 100vh;
box-sizing: border-box;
}
.editor-container {
display: flex;
height: calc(100% - 60px);
gap: 20px;
}
.code-editor {
flex: 1;
border: 1px solid #ddd;
padding: 10px;
}
.preview-area {
flex: 1;
border: 1px solid #ddd;
padding: 20px;
overflow: auto;
}
textarea {
width: 100%;
height: 100%;
padding: 10px;
border: none;
font-family: monospace;
}
</style>
</head>
<body>
<div id="app">
<div class="container">
<el-alert title="实时Element UI编辑器" type="success" :closable="false"></el-alert>
<div class="editor-container">
<div class="code-editor">
<el-tabs v-model="activeTab">
<el-tab-pane label="HTML" name="html">
<textarea v-model="htmlCode"></textarea>
<el-checkbox @change="(val) => {checkchange(item,val)}" v-for="item in options" :key="item.key"
:label="item.label" v-model="checked==item.key">{{item.label}}</el-checkbox>
</el-tab-pane>
<el-tab-pane label="JavaScript" name="js">
<textarea v-model="jsCode"></textarea>
</el-tab-pane>
<el-tab-pane label="CSS" name="css">
<textarea v-model="cssCode"></textarea>
</el-tab-pane>r
</el-tabs>
</div>
<div class="preview-area">
<div id="preview"></div>
</div>
</div>
</div>
</div>
<script>
new Vue({
el: '#app',
data: {
checked: 0,
options:[{key:0,label:"是"},{key:1,label:"否"}],
activeTab: 'html',
htmlCode: `<el-button type="primary">主要按钮</el-button>
<el-input v-model="input" placeholder="请输入内容" style="width: 200px; margin-top: 10px;"></el-input>
<el-date-picker v-model="date" type="date" placeholder="选择日期" style="margin-top: 10px;"></el-date-picker>`,
jsCode: `new Vue({
el: '#preview',
data: {
input: '',
date: ''
}
});`,
cssCode: `#preview {
padding: 20px;
}`
},
watch: {
htmlCode: 'updatePreview',
jsCode: 'updatePreview',
cssCode: 'updatePreview'
},
mounted() {
this.updatePreview();
},
methods: {
checkchange(item,val){
console.log(item,val)
this.checked= val? item.key : null
console.log("checked",this.checked)
},
updatePreview() {
const preview = document.getElementById('preview');
preview.innerHTML = '';
const style = document.createElement('style');
style.textContent = this.cssCode;
document.head.appendChild(style);
try {
const wrapper = document.createElement('div');
wrapper.innerHTML = `
<div id="preview-content">
${this.htmlCode}
</div>
`;
preview.appendChild(wrapper);
const script = new Function(this.jsCode.replace(/new Vue\(/g, 'return new Vue('));
const vm = script();
if (vm) vm.$mount('#preview-content');
} catch (error) {
console.error(error);
preview.innerHTML = `<div style="color: red">Error: ${error.message}</div>`;
}
}
}
});
</script>
</body>
</html>