浅谈Vue模板的那些事儿
接触过vue的童鞋都知道,组件的模板一般都是在template选项内定义的,如
Vue.component('child-component', { template: '<h3>我是闰土大叔</h3>' })
这个用法都是老生常谈了,今天来聊聊Vue的内联模板。看过vue文档的同学都知道,Vue提供了一个内联模板的功能,在使用组件时,给组件标签使用inline-template特性,组件就会把它的内容当做模板,而不是把它当成内容分发,这样做的好处是,让模板更灵活。
介绍完内联模板的概念后,接下来我要分享一个我在工作中碰到的bug,关于内联模板,以及我debug的过程。
先来贴出案发现场的代码片段:
<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>
渲染后的理想结果本应该是:
<div id="app"> <div> <h2>在父组件中定义子组件的模板</h2> <p>在父组件声明的数据</p> <p>在子组件声明的数据</p> </div> </div>
可在Chrome里显示的DOM节点却是这样的:
不仅第一个P标签内的插值没有渲染出来,而且在控制台里还报了一个错误:
说什么Property or method "message" is not defined on the instance but referenced during render.(属性或方法“message”不是在实例上定义的,而是在呈现过程中引用的。)
这个报错让我一脸懵逼,我可是照着书上的代码敲的,来来回回看了N遍,一模一样啊。而且书内提及 “ 在父组件中声明的数据message和子组件中声明的数据msg,两个都可以渲染。”
相信很多刚接触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书写的问题。
今天的文章就分享到这里。
浅谈Vue模板的那些事儿的更多相关文章
- 浅谈Vue下的components模板
浅谈Vue下的components模板在我们越来越深入Vue时,我们会发现我们对HTML代码的工程量会越来越少,今天我们来谈谈Vue下的 components模板的 初步使用方法与 应用 我们先来简单 ...
- 浅谈Vue.js
作为一名Vue.js的忠实用户,我想有必要写点文章来歌颂这一门美好的语言了,我给它的总体评价是“简单却不失优雅,小巧而不乏大匠”,下面将围绕这句话给大家介绍Vue.js,希望能够激发你对Vue.js的 ...
- 浅谈Vue不同场景下组件间的数据交流
浅谈Vue不同场景下组件间的数据“交流” Vue的官方文档可以说是很详细了.在我看来,它和react等其他框架文档一样,讲述的方式的更多的是“方法论”,而不是“场景论”,这也就导致了:我们在阅读完 ...
- 【Vue】浅谈Vue不同场景下组件间的数据交流
浅谈Vue不同场景下组件间的数据“交流” Vue的官方文档可以说是很详细了.在我看来,它和react等其他框架文档一样,讲述的方式的更多的是“方法论”,而不是“场景论”,这也就导致了:我们在阅读完 ...
- 浅谈Vue响应式(数组变异方法)
很多初使用Vue的同学会发现,在改变数组的值的时候,值确实是改变了,但是视图却无动于衷,果然是因为数组太高冷了吗? 查看官方文档才发现,不是女神太高冷,而是你没用对方法. 看来想让女神自己动,关键得用 ...
- 浅谈dedecms模板引擎工作原理及其自定义标签
浅谈dedecms模板引擎工作原理: 理解织梦模板引擎有什么意思? 可以更好地自定义标签.更多在于了解织梦系统,理解模板引擎是理解织梦工作原理的第一步. 理解织梦会使我们写PHP代码是更顺手,同时能学 ...
- 浅谈Vue中计算属性(computed)和方法(methods)的差别
浅谈Vue中计算属性(computed)和方法(methods)的差别 源码地址 methods方法和computed计算属性,两种方式的最终结果确实是完全相同 计算属性是基于它们的响应式依赖进行缓存 ...
- 【Vue】浅谈Vue(一):从模板语法数据绑定、指令到计算属性
写在前面 今年前端届比较有意思,从大漠穷秋发表文章比较angular和vue,继而致歉vue作者.社区,从谷歌辞去Angular Developer PM in China一职并且呼吁大家停止各种无谓 ...
- 浅谈vue性能优化
基础优化 所谓的基础优化是任何 web 项目都要做的,并且是问题的根源.HTML,CSS,JS 是第一步要优化的点 分别对应到 .vue 文件内的,<template>,<style ...
随机推荐
- Ubuntu 报错 sudo: unable to resolve host
Ubuntu 在每次执行命令的时候,会报如下错误: $ sudo sudo: unable to resolve host iZ2zecsdy8flu603bmdg1bZ iZ2zecsdy8flu6 ...
- 项目实战12.1—企业级监控工具应用实战-zabbix安装与基础操作
无监控,不运维.好了,废话不多说,下面都是干货. 警告:流量党勿入,图片太多!!! 项目实战系列,总架构图 http://www.cnblogs.com/along21/p/8000812.html ...
- Java加密与解密笔记(四) 高级应用
术语列表: CA:证书颁发认证机构(Certificate Authority) PEM:隐私增强邮件(Privacy Enhanced Mail),是OpenSSL使用的一种密钥文件. PKI:公钥 ...
- Targets选项下Other linker flags的设置
-ObjC:加了这个参数后,链接器就会把静态库中所有的Objective-C类和分类都加载到最后的可执行文件中 -all_load:会让链接器把所有找到的目标文件都加载到可执行文件中,但是千万不要随便 ...
- 【python】集合set
- 八张图学通JavaScript 转自52
- Ionic2 cordova angular2 打包到Android apk环境搭建
一.前言 前段时间,公司有个APP项目需要支持不同平台,于是采用了Ionic2 + cordova + angular2,在搭建环境过程中遇到了不少问题,刚好最近有时间整理出来. 二.开发环境搭建 参 ...
- DeepLearning.ai学习笔记(一)神经网络和深度学习--Week4深层神经网络
一.深层神经网络 深层神经网络的符号与浅层的不同,记录如下: 用\(L\)表示层数,该神经网络\(L=4\) \(n^{[l]}\)表示第\(l\)层的神经元的数量,例如\(n^{[1]}=n^{[2 ...
- redis hash结构 遍历某一个key下所有的(field,values)的方法
本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/95 redis的hash结构中存储了如下的数据: $input ...
- 关于MAX()函数的一点思考
本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/103 考虑如下表和sql: CREATE TABLE `ikno ...