Vue实例里this的使用
2019独角兽企业重金招聘Python工程师标准>>>
要理解Vue实例里this的使用,首先要理解this在JavaScript里的用法,可以参考理解JavaScript普通函数以及箭头函数里使用的this。
这是vue文档里的原话:
All lifecycle hooks are called with their 'this' context pointing to the Vue instance invoking it.
意思是:在Vue所有的生命周期钩子方法(如created,mounted, updated以及destroyed)里使用this,this指向调用它的Vue实例。
示例分析
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title></title><script src="http://libs.baidu.com/jquery/2.0.0/jquery.js"></script><script src="https://unpkg.com/vue@2.5.9/dist/vue.js"></script>
</head>
<div id="app" style="width: 100%;height: auto;font-size:20px;"><p id="id1"></p><p id="id2"></p>
</div>
<script type="text/javascript">var message = "Hello!";var app = new Vue({el:"#app",data:{message: "你好!"},created: function() {this.showMessage1(); //this 1this.showMessage2(); //this 2},methods:{showMessage1:function(){setTimeout(function() {document.getElementById("id1").innerText = this.message; //this 3}, 10)},showMessage2:function() {setTimeout(() => {document.getElementById("id2").innerText = this.message; //this 4}, 10)}}});
</script>
</html>
示例定义了两个message。一个是全局变量,即window.message,它的值为英文“Hello!”。另外一个是vue实例的数据message,它的值为中文的“你好!”。
运行示例,在浏览器得到:
第一个输出英文"Hello!”,第二个输出中文“你好!”。这说明了showMessage1()里的this指的是window,而showMessage2()里的this指的是vue实例。
created
created: function() {this.showMessage1(); //this 1this.showMessage2(); //this 2
}
created函数为vue实例的钩子方法,它里面使用的this指的是vue实例。
showMessage1()
showMessage1:function(){setTimeout(function() {document.getElementById("id1").innerText = this.message; //this 3}, 10)
}
对于普通函数(包括匿名函数),this指的是直接的调用者,在非严格模式下,如果没有直接调用者,this指的是window。showMessage1()里setTimeout使用了匿名函数,this指向window。
showMessage2()
showMessage2:function() {setTimeout(() => {document.getElementById("id2").innerText = this.message; //this 4}, 10)
}
箭头函数是没有自己的this,在它内部使用的this是由它定义的宿主对象决定。showMessage2()里定义的箭头函数宿主对象为vue实例,所以它里面使用的this指向vue实例。
绑定vue实例到this的方法
为了避免this指向出现歧义,有两种方法绑定this。
使用bind
showMessage1()可以改为:
showMessage1:function(){setTimeout(function() {document.getElementById("id1").innerText = this.message; //this 3}.bind(this), 10)
}
对setTimeout()里的匿名函数使用bind()绑定到vue实例的this。这样在匿名函数内的this也为vue实例。
把vue实例的this赋值给另一个变量再使用
showMessage1()也可以改为
showMessage1:function(){var self = this;setTimeout(function() {document.getElementById("id1").innerText = self.message; //改为self}.bind(this), 10)
}
这里吧表示vue实例的this赋值给变量self。在使用到this的地方改用self引用。
转载于:https://my.oschina.net/jack088/blog/2251579
Vue实例里this的使用相关推荐
- 创建第一个vue实例
一.vue安装与下载 1. 官网下载 下载地址 选择开发版本 2. 打开sublime,新建vue文件夹,将下载好的代码vue.js放入vue文件夹中. 3. 新建index.html文件,在hea ...
- Vue学习笔记:创建一个Vue实例
目录 1.访问Vue官网https://cn.vuejs.org,进入学习模块下的教程 2.创建页面index.html 3.通过script标签在head部分引入vue.js 4.在body部分创建 ...
- Vue实例 和 Vue实例周期生命函数
一.Vue实例 Vue中的每一个组件其实也是一个Vue实例.新建组件item, 模板内容为div块; 现在就可以在根实例里使用这个组件了,使用方法就是通过标签的形式写在根实例里. 实际上在创建组件的 ...
- vue中js文件里获取this(vue实例)
vue中js文件里获取this(vue实例) 1,在main.js中抛出vue实例,在需要用到的地方引入即可 main.js里let vueThis= new Vue({el: '#app',rout ...
- vue邪道玩法 : 把vue实例存在别的地方,以及可能会遇到的问题
一般来说,VUE项目中,this指向VUE实例. 但有的时候,某些代码会改变this的指向. 这时,可以用一个临时变量存储VUE实例. test1(){ var _this = this // 把vu ...
- vue实战记录(二)- vue实现购物车功能之创建vue实例
vue实战,一步步实现vue购物车功能的过程记录,课程与素材来自慕课网,自己搭建了express本地服务器来请求数据 作者:狐狸家的鱼 本文链接:vue实战-实现购物车功能(二) GitHub:sue ...
- vue生命周期图示中英文版Vue实例生命周期钩子
vue生命周期图示中英文版Vue实例生命周期钩子 知乎上近日有人发起了一个 "react 是不是比 vue 牛皮,为什么?" 的问题,Vue.js 作者尤雨溪12月4日正面回应了该 ...
- vue 生命周期_深入理解Vue实例生命周期
vue实例生命周期与生命周期钩子 每个 Vue 实 例在被创建时都会经过一系列的初始化过程.例如,需要设置数据监听.编译模板.将实例挂载到 DOM 并在数据变化时更新 DOM 等. 为了让开发者在 ...
- Vue基础之Vue实例
构造器: 每个 Vue.js 应用都是通过构造函数 Vue 创建一个 Vue 的根实例 启动的: 在实例化 Vue 时,需要传入一个选项对象,它可以包含数据.模板.挂载元素.方法.生命周期钩子等选项. ...
最新文章
- props写法_简单理解vue中Props属性
- 一文读懂MySQL事务锁、事务级别
- MTK Android 编译命令
- 联合国粮农组织总干事屈冬玉 对话国际农民丰收节贸易会
- 基于Linux C的socketEthereal程序和Package分析 (一个)
- 服务器LIMIT是什么信号,Postfix添加milter-limit配置方案
- SecureCRT向多个tab窗口发命令
- 100家店干翻17000家药店!刘强东最恐惧的对手来了!
- 数据库——SQL-SERVER练习(4) 建表及数据完整性
- (day 42 - 字符翻转 ) 剑指 Offer 58 - II. 左旋转字符串
- matlab保存每次循环的结果
- Android 四大组件学习之Activity二
- 数据接口复习 3 stack and queue
- java 3dm_3dm游戏运行库合集安装包-游戏运行库合集安装包下载v3.0DM整理-西西软件下载...
- 显示 think-cell 用户界面时出现错误
- linux sd卡修复工具,免费的SD卡数据恢复工具介绍
- 虚假共识—阿比勒尼悖论:“枪打出头鸟”与“事后诸葛亮”
- js的alert弹框中怎么写html,JavaScript实现alert弹框效果
- Unity官方录屏插件Unity Recorder的简单使用
- 算法高级(15)-LVS的负载均衡策略及LVS+KeepAlived+Nginx实现高可用方案