suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Warum ist „this“ in der Vue 3-Funktion als undefiniert definiert?

Sehen Sie sich das einfache Komponentenbeispiel in Vue 3 unten an:

<script>
import { defineComponent } from 'vue'

export default defineComponent({
  name: 'Test',
  setup(){
    return{
      one,
      two
    }
  }
})

function one(){
  console.log(this) //<-- Proxy{}
  two()
}

function two(){
  console.log(this) //<-- undefined
}
</script>
  
<template>
  <a href="#" @click.prevent="one()">开始</a>
</template>

Ich versuche zu verstehen, warum one()函数调用two()函数时,thistwo()函数中是undefined。两个函数都在setup()中返回,所以我期望它们都能访问this.

Aber wie wäre es mit einem Zitat in two()函数中获取对组件实例this?

P粉057869348P粉057869348410 Tage vor780

Antworte allen(1)Ich werde antworten

  • P粉776412597

    P粉7764125972023-11-07 00:01:40

    我想Vue仍然需要遵守JavaScript的规则。当事件处理程序被调用时,通常是在接收事件的对象的上下文中。在这种情况下,one()被绑定到<a>元素的Proxy,并且this绑定到Proxy

    然而,two()被特别地调用没有上下文(即:two()而不是someobject.foo())。这意味着this将是未定义的。

    我对Vue不是非常熟悉,但我想它不会自动绑定方法,这样就不需要你为你不使用的东西付费。

    由于one()this已正确绑定,你实际上可以将two()作为this的方法调用,而不是作为裸函数调用:

    <script>
    import { defineComponent } from 'vue'
    
    export default defineComponent({
      name: 'Test',
      setup(){
        return{
          one,
          two
        }
      }
    })
    
    function one(){
      console.log(this) //<-- Proxy{}
      this.two()
    }
    
    function two(){
      console.log(this) //<-- Proxy{}
    }
    </script>
      
    <template>
      <a href="#" @click.prevent="one()">开始</a>
    </template>

    Antwort
    0
  • StornierenAntwort