接触过vue的童鞋都知道,组件的模板通常都是在template选项内定义的,如:javascript
1 Vue.component('child-component', { 2 3 template: '<h3>我是闰土大叔</h3>' 4 5 })
这个用法都是老生常谈了,今天来聊聊Vue的内联模板。看过vue文档的同窗都知道,Vue提供了一个内联模板的功能,在使用组件时,给组件标签使用inline-template特性,组件就会把它的内容当作模板,而不是把它当成内容分发,这样作的好处是,让模板更灵活。html
介绍完内联模板的概念后,接下来我要分享一个我在工做中碰到的bug,关于内联模板,以及我debug的过程。vue
先来贴出案发现场的代码片断:java
<div id="app"> <child-component inline-template> <div> <h2>在父组件中定义子组件的模板</h2> <p>{{message}}</p> <p>{{msg}}</p> </div> </child-component> </div> <script src="js/vue.js"></script> <script> Vue.component('child-component',{ data:function(){ return { msg: '在子组件声明的数据' } } }); var app = new Vue({ el:'#app', data:{ message: '在父组件声明的数据' } }) </script>
渲染后的理想结果本应该是:webpack
1 <div id="app"> 2 3 <div> 4 5 <h2>在父组件中定义子组件的模板</h2> 6 7 <p>在父组件声明的数据</p> 8 9 <p>在子组件声明的数据</p> 10 11 </div> 12 13 </div>
可在Chrome里显示的DOM节点倒是这样的:web
不只第一个P标签内的插值没有渲染出来,并且在控制台里还报了一个错误:gulp
说什么Property or method "message" is not defined on the instance but referenced during render.(属性或方法“message”不是在实例上定义的,而是在呈现过程当中引用的。)segmentfault
这个报错让我一脸懵逼,我但是照着书上的代码敲的,来来回回看了N遍,如出一辙啊。并且书内说起 “ 在父组件中声明的数据message和子组件中声明的数据msg,两个均可以渲染。”app
相信不少刚接触vue的新人童鞋都有这种体会,照着书上的代码敲了一遍,结果运行出错,与书上说的结果不一致。当你仔仔细细地检查了半天仍是没发现哪错了的时候,你会不会心里抓狂到怀疑人生?工具
别急,这个时候你必定要有本身的判断,尽信书则不如无书。这句话出自于孟子,释义是读书时应该加以分析,不能盲目的去相信书中所言,必定要辩证的看待问题。万一这本书在排版的时候小编大意写错了呢?也有可能吧。咱们对所谓的技术书籍,在尊敬做者的前提下,也要有批判精神。
其实,console控制台里的错误提示信息,就给你指明了debug的方向。通读一遍代码,咱们能够分析一下,属性message是定义在父组件中的data选项内的,而调用的时候是在子组件里面调用,首先在没有任何干涉的状况下,父子组件是没有互通有无的功能的。因此,这时候你应该会想到,父子组件间传递数据用props啊!有了思路后,那就赶忙把代码敲起来吧:
运行一遍后,果真如你所愿,第一个P标签里的插值顺利地渲染出来了。
除了内联模板,Vue还提供了另外一种效率比较高的定义模板的方式,就是x-template。若是你以前没有使用过webpack、gulp等构件工具,试想下你的组件template的内容很冗长很复杂,若是都在javascript里拼接字符串,效率是很低的,由于不能像写html那么舒服(除非你用ES6里面的模板字符串)。
Vue提供了另外一种定义模板的方式,在<script>标签里使用text/template类型,而且指定一个id,将这个id赋给template,举个栗子:
<div id="app"> <my-component></my-component> <script type="text/x-template" id="my-component"> <div>这是组件的内容</div> </script> </div> <script src="js/vue.js"></script> <script> Vue.component('my-component',{ template:'#my-component' }); var app = new Vue({ el:'#app' }) </script>
这样,在<script>标签里,你能够愉快地写html代码了,不用考虑换行等问题。
不少刚接触Vue开发的新手会很是喜欢这个功能,由于用它,再加上组件知识,就能够很轻松地完成交互相对复杂的页面和应用了。若是再配合一些构件工具(gulp)组织好代码结构,开发一些中小型产品是没有问题的。
不过Vue的初衷并非滥用它,由于它将模板和组件的其余定义隔离了。在以后的文章里,我会介绍如何使用webpack来编译.vue的文件,从而优雅地解决html书写的问题。
今天的文章就分享到这里。
做者:闰土大叔
连接:https://segmentfault.com/a/11...来源:segmentfault著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。