关于Vue.js一些问题和思考学习笔记(1)


Posted in Javascript onDecember 02, 2016

前言

本文不是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://3water.com/article/98869.htm)

Vue学习笔记-2(https://3water.com/article/98878.htm)

本文已被整理到了《Vue.js前端组件学习教程》,欢迎大家学习阅读。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
ext jquery 简单比较
Apr 07 Javascript
基于JQuery.timer插件实现一个计时器
Apr 25 Javascript
Javascript模块化编程(一)模块的写法最佳实践
Jan 17 Javascript
JS 获取浏览器和屏幕宽高等信息的实现思路及代码
Jul 31 Javascript
jquery简单实现带渐显效果的选项卡菜单代码
Sep 01 Javascript
vue-router单页面路由
Jun 17 Javascript
Vue 中mixin 的用法详解
Apr 23 Javascript
vue 组件使用中的一些细节点
Apr 25 Javascript
使用Phantomjs和Node完成网页的截屏快照的方法
Jul 16 Javascript
js实现简单掷骰子小游戏
Oct 24 Javascript
vue 实现cli3.0中使用proxy进行代理转发
Oct 30 Javascript
详谈Vue.js框架下main.js,App.vue,page/index.vue之间的区别
Aug 12 Javascript
利用jQuery来动态为属性添加或者删除属性的简单方法
Dec 02 #Javascript
基于javascript实现的快速排序
Dec 02 #Javascript
微信公众平台开发教程(五)详解自定义菜单
Dec 02 #Javascript
基于jQuery实现滚动切换效果
Dec 02 #Javascript
遍历json 对象的属性并且动态添加属性的实现
Dec 02 #Javascript
Vue.js组件tree实现无限级树形菜单
Dec 02 #Javascript
js中的eval()函数把含有转义字符的字符串转换成Object对象的方法
Dec 02 #Javascript
You might like
PHP 函数语法介绍一
2009/06/14 PHP
PHP+jQuery 注册模块的改进(三):更新到Smarty3.1
2014/10/14 PHP
php中instanceof 与 is_a()区别分析
2015/03/03 PHP
实例讲解PHP设计模式编程中的简单工厂模式
2016/02/29 PHP
php中__toString()方法用法示例
2016/12/07 PHP
Jquery 自定义动画概述及示例
2013/03/29 Javascript
主页面中的两个iframe实现鼠标拖动改变其大小
2013/04/16 Javascript
Jquery 跨域访问 Lightswitch OData Service的方法
2013/09/11 Javascript
Javascript删除指定元素节点的方法
2016/06/21 Javascript
canvas实现简易的圆环进度条效果
2017/02/28 Javascript
Angular.Js中ng-include指令的使用与实现
2017/05/07 Javascript
nodejs中art-template模板语法的引入及冲突解决方案
2017/11/07 NodeJs
vue.js整合mint-ui里的轮播图实例代码
2017/12/27 Javascript
JavaScript实现浅拷贝与深拷贝的方法分析
2018/07/05 Javascript
checkbox在vue中的用法小结
2018/11/13 Javascript
优雅的elementUI table单元格可编辑实现方法详解
2018/12/23 Javascript
微信小程序提取公用函数到util.js及使用方法示例
2019/01/10 Javascript
详解vue中axios的使用与封装
2019/03/20 Javascript
关于ckeditor在bootstrap中modal中弹框无法输入的解决方法
2019/09/11 Javascript
js实现图片粘贴到网页
2019/12/06 Javascript
vue-cli3使用mock数据的方法分析
2020/03/16 Javascript
Python爬虫爬验证码实现功能详解
2016/04/14 Python
Python字典循环添加一键多值的用法实例
2019/01/20 Python
Python 如何反方向迭代一个序列
2020/07/28 Python
10行Python代码实现Web自动化管控的示例代码
2020/08/14 Python
用python实现一个简单计算器(完整DEMO)
2020/10/14 Python
python如何调用php文件中的函数详解
2020/12/29 Python
纯css3实现鼠标经过图片显示描述的动画效果
2014/09/01 HTML / CSS
奥地利票务门户网站:oeticket.com
2019/12/31 全球购物
Linux面试经常问的文件系统操作命令
2015/11/05 面试题
自荐信要包含哪些内容
2013/11/06 职场文书
医学院四年学习生活的自我评价
2013/11/06 职场文书
村委会主任先进事迹
2014/01/15 职场文书
公司节能减排倡议书
2014/05/14 职场文书
教师党员自我评价范文
2015/03/04 职场文书
如何开发一个渐进式Web应用程序PWA
2021/05/10 Javascript