由于前面对html进行过解析,今天想用vue拖拽,实现一手类似快站那种自动生成代码,结果就遇到了拖拽组件过去怎么无法解析的问题,因为vue的v-html为了防止xss攻击只能解析html
思路
先实现简单页面 分三块左中右,左边是需要拖动的组件,中间是用于组件排列显示,右边是解析出的代码
左边组件列表代码
<div ref="test" >
<one-component :title="title[0]" element="<el-radio v-model='radio' label='1'>备选项</el-radio>">
<el-radio slot="component" v-model="radio" label="1">备选项</el-radio>
</one-component>
</div>
</template>
<script>
import OneComponent from '../components/oneComponent'
export default {
name: '',
data() {
return {
radio: '2',
title: ['Radio 单选框']
}
},
components:{
OneComponent
},
}
</script>
<style lang="stylus" scoped>
</style>
中间组件显示代码
<div class="all">
<el-form label-width="80px" label-position="left" :model="ruleForm" :rules="rules">
<el-form-item label="模拟宽" prop="inputW">
<el-input v-model="ruleForm.inputW" placeholder="请输入宽"></el-input>
</el-form-item>
<el-form-item label="模拟高" prop="inputH">
<el-input v-model="ruleForm.inputH" placeholder="请输入高"></el-input>
</el-form-item>
</el-form>
<Variablebox
class="box"
:width="ruleForm.inputW"
:height="ruleForm.inputH"
></Variablebox>
</div>
</template>
<script>
import Variablebox from "../components/Variablebox";
export default {
name: "",
data() {
var checkSize = (rule, value, callback) => {
console.log(value);
if (value < 500 || value > 1000) {
callback(new Error("建议500 ~ 1000内的数字"));
} else if (!Number.isInteger(Number(value))) {
callback(new Error("请输入数字值"));
} else {
callback();
}
};
return {
ruleForm: {
inputW: 500,
inputH: 500
},
rules: {
inputW: [{ validator: checkSize, trigger: "blur" }],
inputH: [{ validator: checkSize, trigger: "blur" }]
}
};
},
methods: {
},
components: {
Variablebox
}
};
</script>
<style lang="stylus" scoped>
.all
padding: 0 20px
display: flex
flex-direction: column
</style>
接下来实现组件的拖拽使用drag和drop 将组件显示在Variablebox页面上,使用v-html无效后,百度了一下,发现基本上叫使用vue.Vue.compile( template ) 和render但是没给例子
compile是将一个模板字符串编译成 render 函数,就是最后
都是render调用createElement,转化成html,但是我们我们是直接渲染
</el-radio slot="component" v-model="radio" label="1"/>
所以个人
感觉行不通,最后只能尝试新建组件然后挂载上去
new Vue({
// el: ‘#app'
template: this.ele,
data:{
radio: '2'
},
}).$mount("#apps");
这样算是暂时决解掉这个问题吧
vue中运用v-html渲染标签
获取后台数据带 标签 内容,需要渲染到页面展示。最终效果如下:图文排版
1.首先拿到数据,单独处理
2.接着在html中输出即可