コンポーネント内でon clickディレクティブを使用しようとしていますが、うまくいかないようです。コンポーネントをクリックすると、コンソールで「テストクリック」が表示されるはずです。コンソールにエラーが表示されないので、何が間違っているのかわかりません。
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(コンポーネント)
<template>
<div>
click here
</div>
</template>
<script>
export default {
name: 'test',
data () {
return {
msg: 'Welcome to Your Vue.js App'
}
}
}
</script>
コンポーネントのルート要素でネイティブイベントを監視したい場合は、次のようにv-on
に 。native 修飾子を使用する必要があります。
<template>
<div id="app">
<test v-on:click.native="testFunction"></test>
</div>
</template>
あるいは、コメントで示唆されているように、手短に言えば、次のようにすることもできます。
<template>
<div id="app">
<test @click.native="testFunction"></test>
</div>
</template>
$emit
関数は私があなたが求めていると思うもののためによりよく機能すると思います。コンポーネントはVueインスタンスから分離されているので、多くの状況で再利用できます。
<template>
<div id="app">
<test @click="$emit('test-click')></test>
</div>
</template>
HTMLで使用する
<test @test-click="testFunction">
それは @ Nepsの答え ですが詳細があります。
注: @ Saurabhの答え は、コンポーネントを変更したくない場合や、したくない場合に適しています。アクセスできません。
コンポーネントは複雑です。 1つのコンポーネントは小さな派手なボタンラッパーにすることができ、もう1つのコンポーネントはたくさんのロジックを含むテーブル全体にすることができます。 Vueはv-model
をバインドしたりv-on
を使用したりするときにあなたが何を期待しているのか正確には知りませんので、それらすべてはコンポーネントの作成者によって処理されるべきです。
Vue docs によると、$emit
はイベントを親に渡します。 docsからの例:
メインファイル
<blog-post
@enlarge-text="onEnlargeText"
/>
コンポーネント
<button @click="$emit('enlarge-text')">
Enlarge text
</button>
(@
はv-on
の省略形 です)
コンポーネントはネイティブのclick
イベントを処理し、親の@enlarge-text="..."
を発行します
ネイティブのクリックイベントを処理しているように見せるために、enlarge-text
をclick
に置き換えることができます。
<blog-post
@click="onEnlargeText"
></blog-post>
<button @click="$emit('click')">
Enlarge text
</button>
しかしそれだけではありません。 $emit
はイベントと共に特定の値を渡すことを可能にします。ネイティブのclick
の場合、値は MouseEvent です(Vueとは無関係のJSイベント)。
Vueはそのイベントを$event
変数に格納します。ですから、ネイティブのイベント使用法の印象を与えるために、イベントと共に$event
を発行するのが最善です。
<button v-on:click="$emit('click', $event)">
Enlarge text
</button>
少し冗長ですが、これが私のやり方です。
@click="$emit('click', $event)"
コンポーネントのネイティブイベントは、親要素から直接アクセスすることはできません。代わりにv-on:click.native="testFunction"
を試すか、Test
コンポーネントからイベントを発行することもできます。 v-on:click="$emit('click')"
のように。