uniapp之this作用域

更新日期: 2020-04-19 阅读: 3.4k 标签: 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');
	    }
	});
},

本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://fly63.com/article/detial/9063

相关推荐

uni-app关于iOS安全区解决方案

在uniapp开发中,我们可能会遇到一个问题,就是在iOS设备上底部会有一个安全区域,导致页面无法完全显示。因为iphoneX等机型最下面会有条黑色等线,导致按钮等元素被遮住部分,所以设置安全区边距会往上提

uni-app怎样设置横屏?

在使用uni-app开发app应用时候,应用需要横屏显示,那么该如何实现呢?打开pages.json页面,在globalStyle中添加pageOrientation选项

uni-app 微信小程序授权登录

uni.getUserInfo 接口调用方式起初通过button 来获取用户信息,或者 直接调用 uni.getUserInfo 来获取信息 在当前微信更新接口后,这2个接口将直接返回匿名用户数据,不在弹窗提示

uni-app中使用computed计算属性

computed里面的属性不能在data属性中出现,用来监控computed中自定义的变量 ,computed合适多个变量或对象处理后返回一个结果值,其中一个值发生变化则computed监控的属性值就会发生变化

uniapp如何打64位的安装包?

目前安卓在上架一些平台会要求64位,否则导致提交审核不成功,比如提示:请提供64位版本软件包后再提交审核。同时在一些骁龙8Gen3的手机上,也不在兼容32位的应用和游戏了

uniapp如何开启短震动_触感反馈实现

使用 uni-app 开发一款 app,需求中有一项是点击 触感反馈,查阅了 uni-app 相关文档,发现并没有对应的 API,最开始尝试用 震动 的方式来模拟 触感反馈 , 但是感觉效果并不好

uniapp开发注意事项

static 目录下的 js 文件不会被编译,如果里面有 es6 的代码,不经过转换直接运行,在手机设备上会报错。css、less/scss 等资源同样不要放在 static 目录下

uni-app实现苹果内购支付功能

首先我们需要勾选苹果支付,在manifest.json中,选择App模块配置->Payment(支付)。然后打包需要选择打基座包来测试。

uniapp验证码倒计时60s的实现

发送验证码时,不能让客户一直发送验证码,所以需要设置一个60s后才能发送一次;具体代码实现:因为app和其他app不太一样,所以需要选择以这样的方式展示是时间,但是js逻辑代码是一样的;

uniapp 页面跳转传值和接收

首先介绍最原始的跳转方法,类似于html中的 a 标签,不过在uniapp中需要将 a 标签换成 <navigator url=跳转的地址>……</navigator>

点击更多...

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