在Vue中调用一个方法时,括号会改变this的值

qvsjd97n  于 2023-04-12  发布在  Vue.js
关注(0)|答案(2)|浏览(143)

在这个例子中,我有一个对象,它有一个name作为string参数,而一个函数只记录this

const me = reactive({
  name: "foo",
  sayHi: function () {
    console.log("Hi I am : ", this);
  },
});

在模板中,我创建了另一个组件,在创建3000ms后发出事件sayHi。这个组件被创建了两次:

  1. <Comp :name="me.name" @sayHi="me.sayHi"/>
  2. <Comp :name="me.name" @sayHi="me.sayHi()"/>
    我有点理解带括号和不带括号的事件处理程序之间的区别,解释了here,但我不明白为什么第一个事件处理程序中的thisundefined,而第二个事件处理程序中的this是我期望的对象本身。
brc7rcf0

brc7rcf01#

v-on指令与@sayHi="me.sayHi()"内联表达式一起提供时,它被一个函数 Package 并编译为如下内容:

el.addEventListener('sayHi', $event => { vm.me.sayHi() })

当一个值是像@sayHi="me.sayHi"这样的函数值时,事件处理程序本身就是一个函数:

el.addEventListener('sayHi', vm.me.sayHi)

正如this question中所解释的,当this的方法被用作回调时,this上下文不是父对象,而当它作为事件处理程序传递时,就会发生这种情况。函数应该显式绑定到所需的上下文,以将其作为this接收。
this question的区别在于sayHi不是组件方法。Vue选项API中的组件methods内部绑定到组件示例,这不适用于组合API。
sayHi应显式引用无功值,而不是使用this

const me = reactive({
  name: "foo",
  sayHi: () => {
    console.log("Hi I am : ", me.name);
  },
});

使用sayHi函数作为React性对象的方法没有任何好处,它被VueReact性API忽略。除非有理由让me成为一个对象,例如它被传递给其他组件,否则状态和函数可以分开:

const me = ref("foo")
const sayHi = () => {
    console.log("Hi I am : ", me.value);
};
42fyovps

42fyovps2#

事件调用的编译方式不同

// <Comp :name="me.name" @sayHi="me.sayHi"/>
let fn = me.sayHi
fn($event) // `this` is undefined us you just calling a function

// <Comp :name="me.name" @sayHi="me.sayHi()"/>
// or
// <Comp :name="me.name" @sayHi="() => me.sayHi()"/>
let fn = () => me.sayHi()
fn($event) // `this` is `me` as you are calling an object method

相关问题