为啥在 Vue Composition API 设置函数中未定义“this”?

Posted

技术标签:

【中文标题】为啥在 Vue Composition API 设置函数中未定义“this”?【英文标题】:Why is "this" undefined in Vue Composition API setup function?为什么在 Vue Composition API 设置函数中未定义“this”? 【发布时间】:2020-11-12 01:46:30 【问题描述】:

我有一个使用 v3 的组合 API 的 Vue 组件:

<template>
  <input type="checkbox" v-model="playing" id="playing" @input="$emit('play', $event.target.value)" />
  <label for="playing" > playing ? 'Pause' : 'Play' </label>
</template>
<script>
export default 
  props: 
    done: Boolean
  ,
  setup(props) 
    const playing = ref(true)
    watchEvent(() => 
      if (props.done) 
        playing.value = false
        this.$emit('play', playing.value)
      
    
    return  playing 
  

</script>

当 watchEvent 运行时,我收到错误 Cannot read property "$emit" of undefined。看起来我没有使用错误类型的函数(箭头与普通函数)。

似乎this 在整个setup() 中是未定义的,无论它是函数还是箭头函数。

【问题讨论】:

【参考方案1】:

setup function in the Vue Composition API 接收两个参数:props 和 context。

第二个参数提供了一个上下文对象,它公开了一个选择性的属性列表,这些属性之前在 2.x API 中公开:

const MyComponent = 
  setup(props, context) 
    context.attrs // Previously this.$attrs
    context.slots // Previously this.$slots
    context.emit // Previously this.$emit
  

请务必注意,不可以解构 props(您会失去反应性),但可以解构上下文。

所以问题中的代码示例,使用setup(props, emit ),然后将this.$emit替换为emit

【讨论】:

以上是关于为啥在 Vue Composition API 设置函数中未定义“this”?的主要内容,如果未能解决你的问题,请参考以下文章

JEST @vue/composition-api + Jest 测试套件无法运行 [vue-composition-api] 在使用任何函数之前必须调用 Vue.use(VueComposition

vue2 和 composition api - 无法导入 store,错误 [vue-composition-api] 在使用任何函数之前必须调用 Vue.use(VueCompositionAPI

未捕获的错误:[vue-composition-api] 必须在使用任何函数之前调用 Vue.use(plugin)

vue3的composition-api实践总结

如何跨多个文件中的多个 Vue 实例正确使用 Vue 3 composition-api

vue2升级vue3: TSX Vue 3 Composition API Refs