- 3.3.1 template的三种写法
3.3.1 template的三种写法
template模板的编写有三种方式,分别是:
- 字符串模板
var vm = new Vue({el: '#app',template: '<div>模板字符串</div>'})
- 选择符匹配元素的
innerHTML模板
<div id="app"><div>test1</div><script type="x-template" id="test"><p>test</p></script></div>var vm = new Vue({el: '#app',template: '#test'})
dom元素匹配元素的innerHTML模板
<div id="app"><div>test1</div><span id="test"><div class="test2">test2</div></span></div>var vm = new Vue({el: '#app',template: document.querySelector('#test')})
模板编译的前提需要对template模板字符串的合法性进行检测,三种写法对应代码的三个不同分支。
Vue.prototype.$mount = function () {···if(!options.render) {var template = options.template;if (template) {// 针对字符串模板和选择符匹配模板if (typeof template === 'string') {// 选择符匹配模板,以'#'为前缀的选择器if (template.charAt(0) === '#') {// 获取匹配元素的innerHTMLtemplate = idToTemplate(template);/* istanbul ignore if */if (!template) {warn(("Template element not found or is empty: " + (options.template)),this);}}// 针对dom元素匹配} else if (template.nodeType) {// 获取匹配元素的innerHTMLtemplate = template.innerHTML;} else {// 其他类型则判定为非法传入{warn('invalid template option:' + template, this);}return this}} else if (el) {// 如果没有传入template模板,则默认以el元素所属的根节点作为基础模板template = getOuterHTML(el);}}}// 判断el元素是否存在function query (el) {if (typeof el === 'string') {var selected = document.querySelector(el);if (!selected) {warn('Cannot find element: ' + el);return document.createElement('div')}return selected} else {return el}}var idToTemplate = cached(function (id) {var el = query(id);return el && el.innerHTML});
注意:其中X-Template模板的方式一般用于模板特别大的 demo 或极小型的应用,官方不建议在其他情形下使用,因为这会将模板和组件的其它定义分离开。
