Я пытаюсь использовать директиву 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>
javascript
vue-component
vuejs2
vue.js
Хавьер Карденас
источник
источник
@click.native="testFunction"
Я думаю, что
$emit
функция работает лучше, чем, по-моему, вы просите. Он хранит ваш компонент отдельно от экземпляра Vue, поэтому его можно многократно использовать во многих контекстах.Используйте это в HTML
источник
@click="$emit('click')"
и таким образом родительский компонент просто использует обычный@click
@click="$emit('click')"
.Это ответ @Neps, но с подробностями.
Примечание : ответ @ Saurabh будет более подходящим, если вы не хотите изменять свой компонент или не имеете к нему доступа.
Почему @click просто не работает?
Компоненты сложны. Один компонент может представлять собой небольшую необычную оболочку для кнопок, а другой - целую таблицу с кучей логики внутри. Vue не знает, что именно вы ожидаете при связывании
v-model
или использовании,v-on
поэтому все это должно обработать создатель компонента.Как обрабатывать событие клика
Согласно документам Vue ,
$emit
передает события родителю. Пример из документов:Основной файл
Составная часть
(
@
являетсяv-on
стенография )Компонент обрабатывает родные
click
событие и испускает родительское событие@enlarge-text="..."
enlarge-text
можно заменитьclick
на, чтобы выглядело, как будто мы обрабатываем собственное событие клика:Но это не все.
$emit
позволяет передать определенное значение с событием. В случае с роднымclick
значение MouseEvent (событие JS, которое не имеет ничего общего с Vue).Vue сохраняет это событие в
$event
переменной. Итак, было бы лучше$event
создать событие, чтобы создать впечатление от использования нативного события:источник
Немного многословно, но вот как я это делаю:
@click="$emit('click', $event)"
источник
$emit
но ничего не происходит. Нужно ли что-то делать в дополнение к$emit
? jsfiddle.net/xwvhy6a3Как отметил Крис Фриц (Vue.js Core Team Emeriti ) в VueCONF US 2019
С Vue 2
Использование
$listeners
:Итак, если вы используете Vue 2, лучшим вариантом для решения этой проблемы будет использование полностью прозрачной логики оболочки . Для этого Vue предоставляет
$listeners
свойство, содержащее объект слушателей, используемых на компоненте. Например:и тогда нам просто нужно добавить
v-on="$listeners"
кtest
компоненту, как:Test.vue (дочерний компонент)
Теперь
<test>
компонент представляет собой полностью прозрачную оболочку , то есть он может использоваться точно так же, как обычный<div>
элемент: все слушатели будут работать без.native
модификатора.Демо-версия:
Используя
$emit
метод:Мы также можем использовать
$emit
метод для этой цели, который помогает нам слушать события дочерних компонентов в родительском компоненте. Для этого нам сначала нужно создать пользовательское событие. из дочернего компонента, например:Test.vue (дочерний компонент)
Важно: Всегда используйте kebab-case для имен событий. Для получения дополнительной информации и демонстрации этого пункта, пожалуйста, ознакомьтесь с ответом: VueJS передает вычисленное значение от компонента к родителю. .
Теперь нам просто нужно прослушать это излучаемое пользовательское событие в родительском компоненте, например:
App.vue
Таким образом, в основном вместо
v-on:click
или стенографии@click
мы будем просто использоватьv-on:my-event
или просто@my-event
.Демо-версия:
С Vue 3
С помощью
v-bind="$attrs"
:Vue 3 собирается сделать нашу жизнь намного проще во многих отношениях. Одним из примеров этого является то, что это поможет нам создать более простую прозрачную оболочку с очень небольшим количеством настроек, просто используя
v-bind="$attrs"
. При использовании этого в дочерних компонентах не только наш слушатель будет работать напрямую от родительского, но также любой другой атрибут также будет работать как обычный<div>
.Итак, что касается этого вопроса, нам не нужно ничего обновлять в Vue 3, и ваш код все равно будет работать нормально, как
<div>
корневой элемент, и он будет автоматически прослушивать все дочерние события.Демо № 1:
Но для сложных компонентов с вложенными элементами, где нам нужно применять атрибуты и события к main
<input />
вместо родительской метки, мы можем просто использоватьv-bind="$attrs"
Демонстрация № 2:
источник
Нативные события компонентов не доступны напрямую из родительских элементов. Вместо этого вы должны попробовать
v-on:click.native="testFunction"
, или вы также можете отправить событие изTest
компонента. Какv-on:click="$emit('click')"
.источник
Из документации :
Из-за ограничений в JavaScript Vue не может обнаружить следующие изменения в массиве:
В моем случае я наткнулся на эту проблему при переходе с Angular на VUE. Исправить было довольно легко, но действительно трудно найти:
источник