vue中有一段html代码,用v-html进行双向绑定,但是这个html代码片段中含有双向绑定数据,插入到位置后就不起作用了,用的是vuejs2.x,
<template>
<div v-html="myhtml">
</div>
</template>
<script>
export default {
name: "testcom",
data(){
return{
age:18,
myhtml:`<p @click="age++">我的年龄是:{{age}}</p>`
}
}
}
</script>
我的年龄是:{{age}}
我试了好多种办法都不行,做到单独子组件中进行重新渲染也不行,插槽也不行,只要是字符串拼接的html代码,都会原样输出到插入位置,代码中的vue双向绑定都会原样输出
我希望通过字符串插入的绑定的html代码片段,其中代码片段又含有vue双向绑定关键字,希望一样要起到双向绑定的作用,我该怎么办?
直接上js操作
<div id="app">
<div v-html="myhtml">
</div>
</div>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script>
new Vue({
el: '#app',
data: {
age: 18,
myhtml: `<p id="myp">我的年龄是:{{age}}</p>`
},
mounted() {
var p = document.getElementById('myp');
p.addEventListener('click', () => {
this.age++;
p.innerHTML =`<p id="myp">我的年龄是:${this.age}</p>`
});
p.innerHTML = `<p id="myp">我的年龄是:${this.age}</p>`
}
});
</script>
你题目的解答代码如下:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<title> 页面名称 </title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
<div v-html="myhtml">
</div>
</div>
<script type="text/javascript">
var app = new Vue({
el: '#app',
name: "testcom",
data(){
return{
age:18,
}
},
computed: {
myhtml() {
return `<p onclick="app.age++">我的年龄是:${this.age}</p>`;
}
}
});
</script>
</body>
</html>
如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!
<template>
<div class="workBench">
<div v-html="myhtml">
</div>
</div>
</template>
<script>
export default {
data () {
return {
age: 18,
myhtml: ''
}
},
created () {
this.myhtml = `<p @click="age++">我的年龄是:${this.age}</p>`
},
methods: {
}
}
</script>
<style lang="scss" scoped>
</style>
我只能放弃了,已经很接近了,但还是不行,
应该是用Vue.extend来创建动态子组件,但是一次创建完好像和父组件脱离上下文关系了,父组件的变化子组件的props接收值不能响应变化,
<template>
<div>
<button @click="changeMyHtml">第一步:点击更换MyHtml</button><br/>
<button @click="changeYear">第二步:点击更新年份</button>
<div v-html="myhtml"> </div>
</div>
</template>
<script>
import Vue from 'vue'
export default {
data () {
return {
year : 2022,
myhtml: "初始化的年份是:{{nian}}"
}
},
watch:{
myhtml(newVal){
var MyComponet = Vue.extend({
template:newVal,
props:["nian"],
mounted() {
console.log("创建了动态组件,并获得了年份:"+this.nian);
//这里输出入一次:
//log结果:创建了动态组件,并获得了年份:2022
//结论:说明父组件用propsData传个这个动态组件,用props接收,实际是接收到了。
},
watch:{
nian(){
console.log("动态组件监听到了year的变化:"+this.nian);
//再次调用父组件的changeYear方法,父组件的this.year更改了,但是传给子组件里的这个nian没有变化,但是这里监听不到
//结论:好像是用Vue.extend创建的内部动态组件,和外部父组件脱离了,没有上下文关系了。
}
}
});
new MyComponet({
propsData:{nian:this.year}
}).$mount('#myhtml');
}
},
methods: {
changeMyHtml(){
this.myhtml=`更换html后年份是:{{nian}}`
},
changeYear(){
this.year++
console.log(this.year)
}
}
}
</script>