vue 箭头函数兼容性_VUE:this丢失

在Vue项目重构中,遇到动态获取并显示下拉列表的问题,原本的函数方式导致扩展性不佳。尝试优化后,Vue的Option未更新,发现不同作用域的this。分析发现,method中的函数在init阶段绑定this,而template中的函数在render阶段执行,导致this指向不同。解决方案是使用箭头函数,因其this继承自外层,确保不丢失。此问题与React类组件中的this丢失问题相似。
摘要由CSDN通过智能技术生成

最近在一个 Vue 的项目中重构功能时,遇到一个有趣的问题,场景是通过接口动态获取名称并显示在下拉列表中,第一次实现的代码如下:

5252290085ae2b0decb1008a3da1c560.png

但这样写代码可扩展性很低,例如这时候需要添加一个查询用户身份的下拉框就要再写一个方法,为了避免复制一堆重复代码。所以我做了一些修改:

acd224463b3fca33cdcf8a30adbaa239.png

但是在运行后,输入名称,视图中的 Option 却没有如预期一样更新后端返回的数据。查看控制台 Network 发起了请求,Vue-tools 中查看 this[typeName] 的确是更新后的值。突然就有点懵了,问题出在什么地方?

分析

在代码中分别打印 this1 和 this2 两个值,发现他们的 _uid 竟然不一样,再看看 this1 中的数据被响应式的更新,但是 this2 中根本没有。

0dd9cf49ecb76509a4b4475a7015eaca.png
_uid 不一致

原因

method 中的方法是在 Vue 实例初始化阶段(init)进行绑定 this,指向当前 Vue 实例;而 template 中的代码是在 render 阶段执行,导致匿名函数的 this 指向代码执行时的上下文,它也是一个 vueComponent 实例,但不是同一个。

解决

办法是用箭头函数替换普通 function,因为箭头函数 this 继承自它的外层,且无法被修改。这样就保证 this 不会丢失。

028b608d711c05d61f0072b16c7afc64.png
修改后 _uid 一致

React 类组件在调用方法时也遇到过 this 丢失的问题,同样可以使用箭头函数来解决这个问题,而且两者造成 this 丢失的原因也非常类似。

回过头想一想,还是印证了那句老话:日光之下,并无新事。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值