在这个例子中,我有一个对象,它有一个name
作为string
参数,而一个函数只记录this
const me = reactive({
name: "foo",
sayHi: function () {
console.log("Hi I am : ", this);
},
});
在模板中,我创建了另一个组件,在创建3000ms后发出事件sayHi
。这个组件被创建了两次:
<Comp :name="me.name" @sayHi="me.sayHi"/>
<Comp :name="me.name" @sayHi="me.sayHi()"/>
我有点理解带括号和不带括号的事件处理程序之间的区别,解释了here,但我不明白为什么第一个事件处理程序中的this
是undefined
,而第二个事件处理程序中的this
是我期望的对象本身。
2条答案
按热度按时间brc7rcf01#
当
v-on
指令与@sayHi="me.sayHi()"
内联表达式一起提供时,它被一个函数 Package 并编译为如下内容:当一个值是像
@sayHi="me.sayHi"
这样的函数值时,事件处理程序本身就是一个函数:正如this question中所解释的,当
this
的方法被用作回调时,this
上下文不是父对象,而当它作为事件处理程序传递时,就会发生这种情况。函数应该显式绑定到所需的上下文,以将其作为this
接收。与this question的区别在于
sayHi
不是组件方法。Vue选项API中的组件methods
内部绑定到组件示例,这不适用于组合API。sayHi
应显式引用无功值,而不是使用this
:使用
sayHi
函数作为React性对象的方法没有任何好处,它被VueReact性API忽略。除非有理由让me
成为一个对象,例如它被传递给其他组件,否则状态和函数可以分开:42fyovps2#
事件调用的编译方式不同
和