uniapp之this作用域

时间: 2020-04-19阅读: 46标签: uniapp

01.先看一个案例

代码如下所示

发现了点击按钮1可以更新title内容,但是点击按钮2却无法更新title内容。这个究竟是为什么呢?

<template>
	<view class="container">
		<text>{{title}}</text>
		<button type="default" @click="changeTitle1">改变标题内容按钮1</button>
		<button type="default" @click="changeTitle2">改变标题内容按钮2</button>
	</view>
</template>

<script>
	export default{
		data(){
			return{
				title : "这个是标题",
			}
		},
		methods:{
			changeTitle1(){
				this.title = "改变标题1";
			},
			//可以发现下面这个执行了success方法,但是调用this赋值却无法改变内容
			changeTitle2(){
				uni.setStorage({
				    key: 'storage_key',
				    data: 'hello',
				    success: function () {
						this.title = "改变标题2";
				        console.log('changeTitle2------success');
				    }
				});
			},
		}
	}
</script>

<style>
	.container{
		display: flex;
		flex-flow: column;
	}
</style>

为什么changeTitle2无法改变title内容

在changeTitle2方法的success方法中,该success方法指向闭包,所以this属于闭包,由此在success回调函数里是不能直接使用this.title的。


02.看一下解决方案

可以发现这样操作就可以解决作用域问题

第一种解决方案

解决办法就是在闭包之外先把this赋值给另一个变量

//可以发现这样操作就可以解决作用域问题
changeTitle3(){
	//赋值
	var me = this;
	uni.setStorage({
	    key: 'storage_key',
	    data: 'hello',
	    success: function () {
			me.title = "改变标题3";
	        console.log('changeTitle2------success');
	    }
	});
},

第二种解决方案

使用箭头函数也可以解决该问题,思考一下这是为什么?

changeTitle4(){
	uni.setStorage({
	    key: 'storage_key',
	    data: 'hello',
	    success:() => {
			this.title = "改变标题4";
	        console.log('changeTitle2------success');
	    }
	});
},

站长推荐

1.阿里云: 本站目前使用的是阿里云主机,安全/可靠/稳定。点击领取2000元代金券、了解最新阿里云产品的各种优惠活动点击进入

2.腾讯云: 提供云服务器、云数据库、云存储、视频与CDN、域名等服务。腾讯云各类产品的最新活动,优惠券领取点击进入

3.广告联盟: 整理了目前主流的广告联盟平台,如果你有流量,可以作为参考选择适合你的平台点击进入

链接: http://www.fly63.com/article/detial/9063

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!

文章投稿关于web前端网站点搜索站长推荐网站地图站长QQ:522607023

小程序专栏: 土味情话心理测试脑筋急转弯幽默笑话段子句子语录成语大全运营推广