前言
本文不是Vue.js的教程,只是一边看官网Vue的教程文档一边记录并总结学习过程中遇到的一些问题和思考的笔记。
1、vue和avalon一样,都不支持VM初始时不存在的属性
而在Angular里是可以支持的,因为angular采用脏检查的方式实现双向绑定,vue和avalon都是采用setter和getter实现双向绑定
例,如下代码在一秒后不会显示出“xxcanghai”的字样
<div id="app"> <h1>{{obj.text}}</h1> </div> <script> var v = new Vue({ el: '#app', data: { obj:{} } }); setTimeout(function(){ v.obj.text="xxcanghai";//无效 },1000); </script>
若给定初始值,则可生效,如下:
<div id="app"> <h1>{{obj.text}}</h1> </div> <script> var v = new Vue({ el: '#app', data: { obj:{ text:"default Text" //给定初始值 } } }); setTimeout(function(){ v.obj.text="xxcanghai";//有效 },1000); </script>
不过Vue其中比avalon好的一点是,Vue在只是对初始化时不存在的属性赋值无效,但显示是不会报错的。而avalon则根本无法显示,对于上述第一段代码运行都会报错(不知道最新的avalon是否修改此问题)
好在vue中提供了$set方法来解决这种赋值失败的问题,如下:
<div i<div id="app"> <h1>{{obj.text}}</h1> </div> <script> var v = new Vue({ el: '#app', data: { obj: {} } }); setTimeout(function() { v.$set("obj.text", "xxcanghai");//有效 }, 1000); </script>
虽然这种采用字符串来表示变量名的方式会导致无法使用强类型的预编译检查(TypeScript),但也至少算能解决问题吧。
注意:Vue2.0已经废弃了vm.$set的用法,应该使用Vm.set()全局方法。
2、input元素中属性与v-model同时存在以属性为优先
如下代码:当文本框中的value属性与v-model冲突时会以input的value属性为优先,并覆盖v-model的属性
最终console.log输出的也是“inputText”
<div id="app"> <input type="text" v-model="a" value="inputText"> </div> <script> var v = new Vue({ el: '#app', data: { a: "vueText" } }); console.log(v.a);//inputText </script>
对于复选框类型的input上述结论也同样适用,如下:
<div id="app"> <input type="checkbox" v-model="isCheck" checked> </div> <script> var v = new Vue({ el: '#app', data: { isCheck: false } }); console.log(v.isCheck);//true </script>
复选框的v-model设定为false不选中,同时设定checked属性选中,最终效果为以checked属性优先,复选框被选中,同时v.isCheck属性被改写为true。
3、VM中的函数放到data属性和methods属性中的区别,以及函数调用时带括号与不带括号的区别
Vue在实例化的时候有一个特殊的属性即methods,我看官方文档中把所有VM中的函数都放到methods属性里面,经测试把函数写在data和methods中都可以正常运行,那么两者有何区别?
通过官方demo可知,在绑定函数的时候可以带括号也可以不带括号,对于有参数的函数那必须带括号调用,但是对于无参函数带括号调用与不带括号调用的区别是什么? 以下测试:
<div id="app"> <button @click="dataFn">1.dataFn</button> <!--输出:<button>,[MouseEvent]--> <button @click="dataFn()">2.dataFn()</button> <!--输出:Vue,[]--> <button @click="methodsFn">3.methodsFn</button> <!--输出:Vue,[MouseEvent]--> <button @click="methodsFn()">4.methodsFn()</button> <!--输出:Vue,[]--> </div> <script> var vm = new Vue({ el: "#app", data: { dataFn: function() { console.log(this,arguments); } }, methods: { methodsFn: function() { console.log(this,arguments); } } }); //xxcanghai@博客园 </script>
通过上述代码对比可以得到以下结论:
- 若想要在事件响应函数中获得Event对象,那么事件绑定时不能加括号,参见上述1、3示例。
- 若想在函数中this指向Vue实例化对象,函数调用时应当加括号。同时,所有在methods属性中的函数,无论如何调用,this都指向当前Vue实例化对象。
- 遂最终结论为:应当把所有VM中的函数都放在methods中,同时对于事件的绑定应当使用无括号方式。即上述示例3中为最优方案。
PS:当然你也可以使用vue内置的$event来显示的传递event对象,以保证函数写在任何位置都可以正常使用this和event。
<div id="app"> <button @click="dataFn($event)">5.dataFn($event)</button> <!--输出:Vue,[MouseEvent]--> <button @click="methodsFn($event)">6.methodsFn($event)</button> <!--输出:Vue,[MouseEvent]--> </div>
相关笔记
Vue学习笔记-1(https://www.jb51.net/article/98869.htm)
Vue学习笔记-2(https://www.jb51.net/article/98878.htm)
本文已被整理到了《Vue.js前端组件学习教程》,欢迎大家学习阅读。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]