详解Vue 动态添加模板的几种方法(2)

目前并没有找到合适的解决方案。2.0 的 Vue 将 compile 工作提前,并且 compiler 也是单独一个包(除非你直接引用的是 vue.js 文件,包含 compiler 和 runtime,那么第一种方法是适用的),那么并不能动态的生成模板。除非用户传入的是 render 能识别的 DOM tree。

按照这样的思路,其实可以让用户传入的模板预先编译好,传入到组件内,拼接 DOM tree 看起来也能解决问题。那么可以这么玩。

看看就好, 性能太渣

首先要安装 Vue JSX 的 相关插件

组件

Vue.component({ name: 'XSelect', render(h) { // 这里获得的 this.template 其实是一个函数,调用该函数返回 DOM // 因此这里的关键代码是拼接一个新的函数,接受 `option` 参数以及上下文 // 使用 new Function 创建一个新函数 return( <divclass="select"> <inputvalue={this.value}readonly/> { this.options.map(option => <div on-click={() => this.$emit('input', option.value) }> { new Function('option', 'return ' + this.template)(option)(h) } </div> ) } </div>) }, props: ['template', 'value', 'options'] })

入口文件

newVue({ el: '#app', data () { return{ value: '' } }, created() { // 初始化需要传入的模板,这里会被 Vue 的 JSX 插件转成 DOM tree this.template = h =><span>标签: { option.label }, 值: { option.value }</span> }, render(h) { return( <x-select v-model="value" :template="template" :options="[ {value: 1, label: 'a'}, {value: 2, label: 'b'}, {value: 3, label: 'c'} ]"> </x-select>) } })

综上,在 Vue 1.x 里不存在 预编译 的概念,所以想动态修改模板还是有许多方式的,甚至还可以结合 <slot></slot> 取到 slot 里的内容拼接进模板里。但 2.0 就麻烦了,并找不到理想的方法。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wypgjj.html