如何显示内部包含 Vue 变量的动态 HTML?
How can I display dynamic HTML having Vue variables inside?
我正在尝试使页面内容动态化。我正在使用 ck-editor,我在其中添加了 html 内容,并在其中使用了我在 vue 文件中声明的相同 vue 变量,我想在其中显示 ck-editor 数据。我在postvuejs - “editing”html里面找到了一个类似的变量
如果我将 html 写在变量中,它就可以正常工作。但就我而言,我将数据保存在数据库中。它使用 html 标签正确保存,无需转换标签。当我使用 axios 获取数据时,它 returns 它以字符串的形式出现。我使用 vue 变量来显示 html.
下面是我的代码,以便更好地理解:
<div v-html="htmlText"></div>
new Vue({
el: '#app',
created() {
this.getSalesContent();
},
data: {
salesContent: '',
pageName: 'Sales',
salesNumber: '987-586-4511'
},
computed: {
htmlText() {
return `${this.salesContent}`;
//return this.salesContent;
}
},
methods: {
getSalesContent(){
axios.get('api/Sales').then(({ data }) => { // getting data from DB
this.salesContent = data.sales; //data.sales have this.pageName and this.salesNumber variables
});
}
}
});
这里是数据库中保存的数据示例:
<p style="font-weight:bold"><span style="color:red">{{pageName}}</span>,</p>
<p style="font-weight:bold"><span style="color:red">${this.pageName} ${this.pageName}</span></p>
<p style="font-weight:bold">Contact Sales at ${this.salesNumber} {{salesNumber}}</span></p>
我以各种可能的方式使用变量。但是在页面上,他们打印的方式与我保存它的方式相同。这是输出:
screenshot
谁能帮我让它工作。
提前致谢。
根据文档,这似乎不可能:
https://vuejs.org/v2/guide/syntax.html#Raw-HTML
特别是:
The contents of the span will be replaced with the value of the
rawHtml property, interpreted as plain HTML - data bindings are
ignored.
您可以按照该答案中的建议,使用基于您从服务器获得的内容的计算值。
恕我直言,因为 salesContent
是从数据库中获取的,所以它是一个普通字符串。因此,vuejs 或 vanilla javascript 都不会用它们的值替换内联变量。 (使用 eval 可能是可行的,但这完全是不可能的...)您应该使用 String replace
函数手动执行此操作。像下面这样:
<p style="font-weight:bold"><span style="color:red">{{pageName}}</span>,</p>
<p style="font-weight:bold">Contact Sales at {{salesNumber}}</span></p>
methods: {
getSalesContent(){
axios.get('api/Sales').then(({ data }) => { // getting data from DB
let salesContent = data.sales; //data.sales have this.pageName and this.salesNumber variables
salesContent = salesContent.replace(/{{pageName}}/g, this.pageName)
salesContent = salesContent.replace(/{{salesNumber}}/g, this.salesNumber)
this.salesContent = salesContent
});
}
}
我正在尝试使页面内容动态化。我正在使用 ck-editor,我在其中添加了 html 内容,并在其中使用了我在 vue 文件中声明的相同 vue 变量,我想在其中显示 ck-editor 数据。我在postvuejs - “editing”html里面找到了一个类似的变量 如果我将 html 写在变量中,它就可以正常工作。但就我而言,我将数据保存在数据库中。它使用 html 标签正确保存,无需转换标签。当我使用 axios 获取数据时,它 returns 它以字符串的形式出现。我使用 vue 变量来显示 html.
下面是我的代码,以便更好地理解:
<div v-html="htmlText"></div>
new Vue({
el: '#app',
created() {
this.getSalesContent();
},
data: {
salesContent: '',
pageName: 'Sales',
salesNumber: '987-586-4511'
},
computed: {
htmlText() {
return `${this.salesContent}`;
//return this.salesContent;
}
},
methods: {
getSalesContent(){
axios.get('api/Sales').then(({ data }) => { // getting data from DB
this.salesContent = data.sales; //data.sales have this.pageName and this.salesNumber variables
});
}
}
});
这里是数据库中保存的数据示例:
<p style="font-weight:bold"><span style="color:red">{{pageName}}</span>,</p>
<p style="font-weight:bold"><span style="color:red">${this.pageName} ${this.pageName}</span></p>
<p style="font-weight:bold">Contact Sales at ${this.salesNumber} {{salesNumber}}</span></p>
我以各种可能的方式使用变量。但是在页面上,他们打印的方式与我保存它的方式相同。这是输出:
screenshot
谁能帮我让它工作。
提前致谢。
根据文档,这似乎不可能:
https://vuejs.org/v2/guide/syntax.html#Raw-HTML
特别是:
The contents of the span will be replaced with the value of the rawHtml property, interpreted as plain HTML - data bindings are ignored.
您可以按照该答案中的建议,使用基于您从服务器获得的内容的计算值。
恕我直言,因为 salesContent
是从数据库中获取的,所以它是一个普通字符串。因此,vuejs 或 vanilla javascript 都不会用它们的值替换内联变量。 (使用 eval 可能是可行的,但这完全是不可能的...)您应该使用 String replace
函数手动执行此操作。像下面这样:
<p style="font-weight:bold"><span style="color:red">{{pageName}}</span>,</p>
<p style="font-weight:bold">Contact Sales at {{salesNumber}}</span></p>
methods: {
getSalesContent(){
axios.get('api/Sales').then(({ data }) => { // getting data from DB
let salesContent = data.sales; //data.sales have this.pageName and this.salesNumber variables
salesContent = salesContent.replace(/{{pageName}}/g, this.pageName)
salesContent = salesContent.replace(/{{salesNumber}}/g, this.salesNumber)
this.salesContent = salesContent
});
}
}