Ошибка события: TypeError: невозможно прочитать свойства неопределенного значения (чтение «stopPropagation»)

Я не могу использовать модификаторы щелчка при передаче события щелчка из дочернего компонента в родительский компонент. Кто-нибудь знает, что я могу здесь делать неправильно?

У меня есть такой компонент:

<!-- ButtonComponent -->
<template>
  <button @click = "$emit('click')">Click Me</button>
</template>

<script setup>
</script>

И я использую это так:

<template>
  <ButtonComponent @click = "doSomething()" />
</template>

Однако когда я пытаюсь применить модификатор stop:

<ButtonComponent @click.stop = "doSomething()" />

Я получаю следующую ошибку:

[Предупреждение Vue]: ошибка в обработчике v-on: «TypeError: невозможно прочитать свойства неопределенного значения (чтение 'stopPropagation')»

Пример песочницы

Бонус: я бы предпочел не генерировать события из дочернего компонента вручную. Вместо этого я бы предпочел, чтобы дочерний компонент пересылал все события родительскому компоненту.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
198
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  1. Обработчик кликов назначается корневому элементу из-за резервных атрибутов, поэтому;
<button>Click Me</button> 
  1. Ошибка возникает потому, что модификатор .stop фактически назначает дополнительный обработчик, который ожидает объект с методом stopPropagation, передайте специальную переменную $event, которая будет обрабатываться этим дополнительным обработчиком:
<button @click = "$emit('click', $event)">Click Me</button> 
  1. Однако использование явного $event полезно для многокорневых компонентов:

ИГРОВАЯ ПЛОЩАДКА VUE SFC

<script setup>
const $emit=defineEmits(['click']);
</script>

<template>
  <button @click = "$emit('click', $event)">Click Me</button>
  <div>I'm a multiroot component</div>
</template>

Да, а почему ошибка?

kissu 03.05.2024 00:31

@kissu добавил объяснение

Alexander Nenashev 03.05.2024 00:38

@kissu добавил пример, где нужен $event

Alexander Nenashev 03.05.2024 00:40

Хм, у меня никогда не было этой ошибки, потому что она в основном была неявной и работала хорошо. Но я предполагаю, что с Vue3 кое-что изменилось и теперь необходимо явно объявлять $event. Это можно считать ошибкой, потому что я не вижу никакой пользы в том, чтобы делать это явным образом.

kissu 03.05.2024 00:43

@kissu, это не ошибка, вы пересылаете событие без объекта события. ошибка с вашей стороны 🤷‍♂️

Alexander Nenashev 03.05.2024 00:48

Я не понимаю, почему сахарный синтаксис Vue неявно пересылает пользовательский вывод из компонента, а не из HTML-элемента. Я имею в виду, что такая ситуация в любом случае случалась бы нечасто, но я не вижу смысла в сбое здесь, вместо того, чтобы быть достаточно умным и пересылать неявное $event. Возможно, однажды я спрошу об этом в основном репозитории.

kissu 03.05.2024 00:55

@kissu я не понимаю, почему Vue должен неявно добавлять дополнительный параметр для вызова, который написан явно.

Alexander Nenashev 03.05.2024 00:58

Потому что он уже делает это в основном для других случаев? В любом случае. И я не ОП + вы не должны просить ОП принять или что-то в этом роде (очевидно, оказывает давление на людей).

kissu 03.05.2024 01:00

@kissu извини, принял тебя за ОП...

Alexander Nenashev 03.05.2024 01:01

Спасибо! Я так рад, что это было простое решение.

Josh 03.05.2024 14:51

Было 2 голоса, я проголосовал против, и там все равно было 2 голоса. Я тоже не могу снова нажать "Проголосовать" :shrug:

Josh 03.05.2024 15:35

Другие вопросы по теме