当前位置: 首页 > Web前端 > HTML

VueJS如何编译服务端远程模板【异步组件+简单方法】

时间:2023-04-02 22:17:12 HTML

说明有时候可能需要从后台获取模板,在前台自己编译。这个在使用AngularJS1.x的时候好像很常见,直接用ng-include就可以搞定,在Vue1.x也可以直接用partial搞定。但是在Vue2.x中,官方取消了partialAPI,建议根据情况使用component代替。请参阅此处的要求。现在我有一个需求,就是从后台获取一个字符串模板(假设里面包含了v-model等vue指令。),这个模板需要在前台进行编译,那么如何实现呢?(这种需求确实比较少,但是是存在的。。。)可能的解决方案官方根据情况给partial推荐了三种替代方案,分别是:normal组件,不在性能关键区域的常规组件(在简单来说,对性能有很大的影响),使用动态组件动态组件,根据组件名称动态绑定时使用功能组件function组件,在性能关键的地方使用。另外根据文档中的情况:异步组件和高级异步组件(Asynchronouscomponents)也有可能解决楼主的问题我们分开来分析一下:常规组件用法//RegisterVue.component('my-component',{template:'

Acustomcomponent!
'})//创建一个根实例newVue({el:'#example'})这是一个普通组件的注册方法我们先来看看生命周期Vue实例图,摘自官网:图中黄色部分为Vue实例的模板从哪里来?el选项提供的selector和template选项提供的string(当然没有它会编译组件的outerHTML)还有其他的可能吗?没有了。..而且这两个选项都在beforeMount之前提供,什么意思呢?这意味着一旦提供了这两个选项,就无法更改!因此,在声明组件时,这两个选项必须作为编译模板提供,并且不能更改。如果我想异步获取模板进行编译,显然是不可能的。所以,常规组件,典当。动态组件动态组件简单的使用让多个组件使用一个挂载点,currentView可以直接注册组件,如:varvm=newVue({el:'#example',data:{currentView:'home'},components:{home:{/*...*/},posts:{/*...*/},archive:{/*...*/}}})也可以是选项对象!!varHome={template:'

Welcomehome!

'}varvm=newVue({el:'#example',data:{currentView:Home}})据我们目前所知,已导入组件通常准备就绪。如果要异步加载,可能会需要webpack的一些功能,暂时略过。那个动态组件可以是一个选项对象?如果选项对象是异步的怎么办?嗯,还有希望~糖糖先记起来~功能组件,第一次看文档,不是很懂,没事!找到关键点:API:如果renderfunctionVue选项中的render函数存在,Vue构造函数不会从template选项中提取的HTML模板或el选项指定的挂载元素编译render函数。这里说的很清楚了,template或者el选项最终都会被编译成render函数,如果有render函数,那两个选项都会被忽略。还是要看上图,render函数已经在beforeMount中编译好了,所以不能改。所以,函数组件,pawn。异步组件直接从官网提取。在大型应用中,我们可能需要将应用拆分成多个小模块,按需从服务器下载。为了让事情变得更简单,Vue.js允许将组件定义为动态解析组件定义的工厂函数。Vue.js仅在组件需要渲染时触发工厂函数,并将结果缓存起来以供以后重新渲染。例如:Vue.component('async-example',function(resolve,reject){setTimeout(function(){//将组件定义传递给resolve回调resolve({template:'
Iamasync!
'})},1000)})可以看出,异步组件基本可以满足楼主的需求,不过上面是用ES5写的,大家可以猜想在ES6中的写法可能如下://某个vue文件exportdefaultfunction(resolve,reject){//远程加载你的模板apiService.then(data=>{resolve({template:data})}}但是这个楼主没有实际使用过,ES5官方可以把option对象定义成一个factorySquare函数,ES6应该可以直接返回工厂函数,有兴趣的同学可以试试告诉发帖者,发帖者并没有使用上面的异步组件(其实是因为我不会当时理解),我在工作中实际使用了动态组件,结合了Vue的computed属性。灵感来源和vue论坛:innerhtml-compilation-vueLinuxBorg在论坛上回答另一个同学的问题时提到过。您可以在下面看到来自主机的消息~computed:{dynComponent(){consttemplate=this.content?this.content:'
nothinghereyet
'return{template,//使用内容作为这个组件的模板props:this.$options.props//重新使用当前的props定义}}即计算属性直接返回一个组件的option对象。这个选项对象的模板可以异步获取,然后配合动态组件帮你编译远程模板,并且因为计算属性的响应式,如果远程模板改了,会自动重新编译~当然楼主比这个复杂多了,会涉及到v-model等双向绑定,需要对组件再封装一层,转换模板,所以这里我就不细说了。总结总之,上面分析了在VueJS2.x中编译远程模板的可能性,最后得出了两种方法:异步组件,应该是官方推荐的方法动态组件+computed,一种workaround,在论坛上找到的当然,如果你有其他的想法,欢迎交流。如果本文有不严谨和不正确的地方,欢迎大家指出~本文转载于我的博客。