Ich versuche, die On-Click-Direktive in einer Komponente zu verwenden, aber sie scheint nicht zu funktionieren. Wenn ich auf die Komponente klicke, passiert nichts, wenn in der Konsole ein "Test angeklickt" werden soll. Ich sehe keine Fehler in der Konsole, daher weiß ich nicht, was ich falsch mache.
index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>vuetest</title>
</head>
<body>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>
App.vue
<template>
<div id="app">
<test v-on:click="testFunction"></test>
</div>
</template>
<script>
import Test from './components/Test'
export default {
name: 'app',
methods: {
testFunction: function (event) {
console.log('test clicked')
}
},
components: {
Test
}
}
</script>
Test.vue (die Komponente)
<template>
<div>
click here
</div>
</template>
<script>
export default {
name: 'test',
data () {
return {
msg: 'Welcome to Your Vue.js App'
}
}
}
</script>
javascript
vue-component
vuejs2
vue.js
Javier Cárdenas
quelle
quelle
@click.native="testFunction"
Ich denke, die
$emit
Funktion funktioniert besser für das, wonach Sie fragen. Dadurch wird Ihre Komponente von der Vue-Instanz getrennt, sodass sie in vielen Kontexten wiederverwendet werden kann.Verwenden Sie es in HTML
quelle
@click="$emit('click')"
und auf diese Weise verwendet die übergeordnete Komponente nur die reguläre@click
@click="$emit('click')"
.Es ist die Antwort von @Neps, aber mit Details.
Hinweis : Die Antwort von @ Saurabh ist besser geeignet, wenn Sie Ihre Komponente nicht ändern möchten oder keinen Zugriff darauf haben.
Warum kann @click nicht einfach funktionieren?
Komponenten sind kompliziert. Eine Komponente kann ein kleiner ausgefallener Button-Wrapper sein, und eine andere kann eine ganze Tabelle mit einer Menge Logik sein. Vue weiß nicht genau, was Sie beim Binden
v-model
oder Verwenden erwarten,v-on
daher sollte all dies vom Ersteller der Komponente verarbeitet werden.Umgang mit Klickereignissen
Nach Vue docs ,
$emit
geht Ereignisse Eltern. Beispiel aus Dokumenten:Hauptdatei
Komponente
(
@
ist diev-on
Abkürzung )Die Komponente behandelt native
click
Ereignisse und gibt übergeordnete Ereignisse aus@enlarge-text="..."
enlarge-text
kann durch ersetzt werdenclick
, damit es so aussieht, als würden wir ein natives Klickereignis behandeln:Aber das ist nicht alles.
$emit
Ermöglicht die Übergabe eines bestimmten Werts mit einem Ereignis. Im Fall von nativeclick
ist der Wert MouseEvent (JS-Ereignis, das nichts mit Vue zu tun hat).Vue speichert dieses Ereignis in einer
$event
Variablen. Es ist also am besten,$event
mit einem Ereignis zu emittieren , um den Eindruck einer nativen Ereignisnutzung zu erwecken:quelle
Ein bisschen ausführlich, aber so mache ich es:
@click="$emit('click', $event)"
quelle
$emit
aber es passiert nichts. Muss ich zusätzlich noch etwas tun$emit
? jsfiddle.net/xwvhy6a3Auf native Ereignisse von Komponenten kann von übergeordneten Elementen nicht direkt zugegriffen werden. Stattdessen sollten Sie es versuchen
v-on:click.native="testFunction"
, oder Sie können auch ein Ereignis von einerTest
Komponente ausgeben . Wiev-on:click="$emit('click')"
.quelle
Wie von Chris Fritz ( Vue.js Kernteam Emeriti ) in VueCONF US 2019 erwähnt
Mit Vue 2
Verwenden von
$listeners
:Wenn Sie also Vue 2 verwenden, ist die Verwendung einer vollständig transparenten Wrapper- Logik eine bessere Option, um dieses Problem zu beheben . Zu diesem Zweck stellt Vue eine
$listeners
Eigenschaft bereit, die ein Objekt von Listenern enthält, die für die Komponente verwendet werden. Beispielsweise:und dann müssen wir
v-on="$listeners"
dertest
Komponente nur noch Folgendes hinzufügen :Test.vue (untergeordnete Komponente)
Jetzt ist die
<test>
Komponente ein vollständig transparenter Wrapper , was bedeutet, dass sie genau wie ein normales<div>
Element verwendet werden kann: Alle Listener funktionieren ohne den.native
Modifikator.Demo:
Mit
$emit
Methode:Zu
$emit
diesem Zweck können wir auch eine Methode verwenden, mit der wir Ereignisse von untergeordneten Komponenten in übergeordneten Komponenten abhören können. Dazu müssen wir zuerst ein benutzerdefiniertes Ereignis von einer untergeordneten Komponente wie folgt ausgeben :Test.vue (untergeordnete Komponente)
Wichtig: Verwenden Sie für Ereignisnamen immer Kebab-Groß- / Kleinschreibung. Weitere Informationen und eine Demo zu diesem Punkt finden Sie in der folgenden Antwort: VueJS übergibt den berechneten Wert von der Komponente an die übergeordnete Komponente .
Jetzt müssen wir nur noch dieses ausgegebene benutzerdefinierte Ereignis in der übergeordneten Komponente abhören, wie:
App.vue
Also, im Grunde anstelle von
v-on:click
oder der Abkürzung werden@click
wir einfachv-on:my-event
oder nur verwenden@my-event
.Demo:
Mit Vue 3
Verwenden von
v-bind="$attrs"
:Vue 3 wird unser Leben in vielerlei Hinsicht viel einfacher machen. Eines der Beispiele dafür ist, dass es uns helfen wird, einen einfacheren transparenten Wrapper mit sehr wenig Konfiguration zu erstellen, indem wir nur verwenden
v-bind="$attrs"
. Wenn Sie dies für untergeordnete Komponenten verwenden, funktioniert nicht nur unser Listener direkt vom übergeordneten Element aus, sondern auch jedes andere Attribut funktioniert genauso wie normal<div>
.In Bezug auf diese Frage müssen wir in Vue 3 nichts aktualisieren, und Ihr Code funktioniert weiterhin einwandfrei, ebenso
<div>
wie das Stammelement hier, und er hört automatisch alle untergeordneten Ereignisse ab.Demo Nr. 1:
Aber für komplexe Komponenten mit verschachtelten Elementen, bei denen wir Attribute und Ereignisse
<input />
anstelle der übergeordneten Bezeichnung auf main anwenden müssen, können wir sie einfach verwendenv-bind="$attrs"
Demo # 2:
quelle
Aus der Dokumentation :
Aufgrund von Einschränkungen in JavaScript kann Vue die folgenden Änderungen an einem Array nicht erkennen:
In meinem Fall bin ich bei der Migration von Angular auf VUE auf dieses Problem gestoßen. Die Lösung war recht einfach, aber sehr schwer zu finden:
quelle