2017-09-27 4 views
1

Ich versuche, diese für den Zugriff auf $ el.offsetTop in einer berechneten Eigenschaft, sondern erhalten den Fehler:.

Cannot read property 'offsetTop' of undefined 

Wie kann ich die offsetTop der Komponente in einem Zugriff berechnete Methode? Wenn das nicht möglich ist, gibt es dann eine Alternative?

Komponente:

<template> 
    <div :class="{ 'active' : test }"></div> 
</template> 
<script> 
export default { 

    computed: { 

     test() { 
      console.log(this.$el.offsetTop); 
     } 
    } 
} 
</script> 
+0

zeigen die Komponente? – Bert

+0

Der berechnete Wert wird möglicherweise vor der Montagezeit ausgewertet. Test auf Existenz von $ el. –

+0

Haben bearbeitet, um Komponente hinzuzufügen. – panthro

Antwort

2

Wenn eine berechnete Eigenschaft in der Vorlage verwendet wird, dessen Methode wird vor dem Vue Beispiel feuern montiert ist, so wird this.$elundefined sein.

Wenn Ihre berechnete Eigenschaft von einer Eigenschaft der this.$el abhängt, können Sie sie auf eine Dateneigenschaft im Hook setzen (wobei this.$el definiert wird).

In Ihrem Fall:

<template> 
    <div :class="{ 'active' : test }"></div> 
</template> 

<script> 
export default { 
    data() { 
    return { offsetTop: null }; 
    }, 
    computed: { 
    test() { 
     console.log(this.offsetTop); 
    } 
    }, 
    mounted() { 
    this.offsetTop = this.$el.offsetTop; 
    } 
} 
</script> 
+0

Danke für die Erklärung. Ich wollte es in berechnet, damit ich den Wert zu der Zeit bekommen konnte, also an einem Punkt kann es 100px von oben sein, ein anderes 200px und so weiter ... Die obige Lösung setzt nur den offsetTop einmal. – panthro

+0

Berechnete Eigenschaften werden nur aktualisiert, wenn abhängige Dateneigenschaften in der Vue-Instanz geändert werden. Eine berechnete Eigenschaft wird nicht als Reaktion auf eine Änderung von "this. $ El" aktualisiert, da Vue nicht über eine integrierte Methode zum Erkennen und Reagieren auf Änderungen am Stamm-DOM-Element verfügt. Es könnte Plugins geben, die es unterstützen, oder Sie müssen das offsetTop manuell beobachten. – thanksd

Verwandte Themen