聊一聊 Vue 中 watch 的回调函数为什么不能是箭头函数?

聊一聊 Vue 中 watch 对象中的回调函数为什么不能是箭头函数

本文重点知识点速览:

  • Vue 中的 watch 对象中的回调函数不能是箭头函数。
  • 箭头函数中的 this 指向的是函数定义时所在的对象,普通函数中的 this 指向的是函数运行时所在的对象。
  • 函数的 this 指向问题。

一起学习吧…

说起箭头函数大家一定不陌生,箭头函数是 ES6 中对函数的扩展,使用起来方便快捷,可能有些小伙伴对箭头函数不是特别了解,所以在这里先举个例子吧。

// 普通函数定义
function add(a, b) {
	return a + b;
}

// 箭头函数等价定义
const add = (a, b) => {
  return a + b;
}

// 普通匿名函数
fucntion() {
  console.log('hello');
} 

// 箭头函数等价定义
() => {
  console.log('hello');
}

箭头函数在定义回调函数中使用的非常多,但是在 Vue 中的 watch 对象的回调函数中就不能使用回调函数,先看下面的例子:

代码有一点长,简单说明一下就不用看所有的代码了,下面代码实现的是实现监视数据 a 和 b 的变化,当其中一个改变时执行相应的回调函数求a与b的和,重点在 23-30 行。

下面的代码中 watch 中回调函数是普通的函数,我们知道 对于普通函数,函数中的this指向函数运行时所在的对象。

所以,当我们在浏览器中改变a的值时(例如在浏览器的控制台输入 vm.a = 10),代码 23 行打印出来的是一个 Vue 对象(即代码 14行新创建出来的vm实例),因为此时 代码 22 行的 function 函数运行在 vm 对象中,此时页面会发生变化,由原来的 3 变为 12.

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Vue中的watch</title>
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
  <div id="app">
    {{sum}}
  </div>

  <script>
    var vm = new Vue({
      el: "#app",
      data: {
       	a: 1,
        b: 2,
        sum: 3
      },
      watch: {
        a: function() {
 					console.log(this);
          this.sum = this.a + this.b;
        },
        b: function() {
          this.sum = this.a + this.b;
        }
      }
    })
  </script>

</body>
</html>

我们再来看一下用箭头函数当做 watch 的回调函数的情况,把代码21-29行换成如下的代码即可:

watch: {
  a: () => {
    console.log(this);
    this.sum = this.a + this.b;
  },
    b: () => {
      this.sum = this.a + this.b;
    }
}

当我们这时候再在浏览器的控制台改变 a 的值时(比如 在控制台输入 vm.a = 10),会发现打印出来的是 window 对象,所以页面的内容也不会发生变化。

JS 代码分为 预解析阶段和执行阶段,在预解析阶段遇到函数声明会提前进行预解析,此时下面代码中的箭头函数会在全局定义,因为 var vm = new Vue({...}) 这句代码在预解析阶段还没有被执行。当到了执行阶段并且在控制台改变 a 的值后,watch 中的下面代码中的箭头函数开始执行,此时的运行环境确实是新创建的 vm 对象。但是对于箭头函数来说,箭头函数中的 this 指向的是定义时的对象而不是函数运行时所在的对象,这一点与普通函数有很大的区别。

  a: () => {
    console.log(this);
    this.sum = this.a + this.b;
  }

如果对于 this 的指向问题如果还不是很清楚可以参考下面的两篇博客:

欢迎指正

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3,可以使用`watch`函数来监听父组件传给子组件的值。根据引用[1]的代码,子组件通过`defineExpose`暴露了自己的属性`inputVal`和方法`exposeFun`。在父组件,可以使用`watch`函数来监听子组件的属性变化。例如,如果要监听子组件的`inputVal`属性,可以这样: ```javascript import { watch } from 'vue'; watch(() => SonVue.inputVal, (newVal, oldVal) => { console.log('子组件的inputVal发生变化', newVal, oldVal); }); ``` 这样,当子组件的`inputVal`属性发生变化时,回调函数就会被触发,并打印出新值和旧值。需要注意的是,`watch`函数的第一个参数是一个函数,返回要监听的值,而不是直接传入要监听的值本身。所以在这里,我们使用了箭头函数来返回`SonVue.inputVal`。 另外,根据引用[3]的代码,`watch`函数还可以监听多个值或对象的属性。如果要监听多个值,可以将这些值放在一个数组传入`watch`函数。如果要监听对象的属性,可以将一个函数返回这个属性的值。例如,如果要监听子组件的`inputVal`和父组件的`msg`,可以这样: ```javascript watch([() => SonVue.inputVal, () => msg.value], ([newInputVal, newMsg], [oldInputVal, oldMsg]) => { console.log('子组件的inputVal和父组件的msg任意一个发生变化都触发', newInputVal, oldInputVal, newMsg, oldMsg); }); ``` 这样,当子组件的`inputVal`或父组件的`msg`发生变化时,回调函数就会被触发,并打印出新值和旧值。 总结起来,Vue3可以使用`watch`函数来监听父组件传给子组件的值,可以监听单个值、多个值或对象的属性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值