vue.js 2中如何在代码中使用vue的模板引擎生成html?
需求: 后端会返回一个各种内容组合的数据到前端。前端需要根据对应的名称生成各种展示样式例:
{name: 'x', address:{'p': '省名', 'c': '市名', 'd': '区县名称', 's': '具体街道'}, capital: [{'name':'某投资人', 'amount':'投资金额', 'percent': '投资占比', 'vision':'投资愿景'},...]}
上面有三个简单的示例(/业务场景比这个多):
name: 需要直接输出即可, address: 需要按某种格式输出, capital: 需要每个投资人一行. 其中capital.name要增加连接
现代码:
<tr v-for="(val,key,index) in alterBase" :key="index">
<td class="title-center">{{ index+1 }}</td>
<td>{{ printChangeItem(key) }}</td>
<td class="value-column" v-html="printAdapterExpr(key, val)"></td>
</tr>
printChangeItem方法负责将英文键换成中文. printAdapterExpr方法根据不同的键格式化输出html字符串。它只是一个委托方法: 若存在格式化方法(printCapital)调用.不存在直接输出:val
问题:如何在某个格式化方法(printCapital)中使用vue的模板来生成html
回复
1个回答
test
2024-07-01
模板:
<template>
<div>
<el-row>
<table class="oams-table" v-loading="isLoding">
<tbody>
<tr v-for="(val,key,index) in alterBase" :key="index">
<td class="title-center">{{ index+1 }}</td>
<td>{{ printChangeItem(val.item) }}</td>
<td class="value-column"><renderVDom :vNode="printAdapterExpr(val.item, val.before, 'before')"></renderVDom></td>
<td class="value-column"><renderVDom :vNode="printAdapterExpr(val.item, val.after, 'after')"></renderVDom></td>
</tr>
</tbody>
</table>
</el-row>
</div>
</template>
script:
export default {
name: 'xxxx',
components: {
renderVDom: {
props: {
vNode: [Array, String, Object, Number]
},
methods:{
isVNode(arg){
// 获取 vnode 实例
let _vnode = this.$createElement('span', '')
// VNode 构造函数
let __VNode = _vnode.constructor
return arg instanceof __VNode
}
},
render (h, context) {
return this.isVNode(this.vNode) ? this.vNode : h('div', { domProps: { innerHTML: this.vNode } }, [])
}
}
},
props: {},
methods: {
printAdapterExpr(key, val, offset){
// 若不存在直接输出
// 1)非VNode
return val
// 2)
// 2.1) JSX
// return <span>{val}</span>
// 2.2) 创建VNode
// return this.$createElement('span', val)
}
}
}
回复
适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容