Ошибка: [Vue warn]: неверный обработчик события «щелчок»: не определен

Я использую Vue 2 (синтаксис класса) и Typescript (синтаксис TSX), и я знаю, что этот вопрос задавали несколько раз, но ни один из ответов, которые я видел, не применим к моей собственной ситуации.

Я создал массив объектов и вывожу эти объекты как пользовательские элементы HTML, назовем их Chips. Chip принимает свойство selected как boolean.

Массив называется registerCategory, и каждый объект в массиве имеет name (в основном только его текст) и boolean, который я назвал is_selected, по умолчанию это false.

Хорошо, вот как я вывел свой массив

  {this.registerCategory.map((field, index) => (
    <ZChip
    position = {'start'}
    id = {'field-' + index}
    value = {field}
    selected = {this.registerCategory[index].is_selected}
    onClick = {this.onCategorySelect(index)}
    >
      {this.$t(this.registerCategory[index].name)}
    </ZChip>
  ))}

Это прекрасно выводит все элементы. Теперь моя проблема заключается в том, чтобы их выбирать по клику.

Я сделал эту функцию в отдельном файле registration.mixin.ts (это то же место, где массив определен в блоке computed):

  methods: {
    onCategorySelect(index: number): void {
      this.registerCategory[index].is_selected = true;
    },
}

Это должно изменить is_select, так как выбран только выбранный элемент boolean. Однако это дало мне:

[Предупреждение Vue]: неверный обработчик события «щелчок»: не определен

Любая помощь, решение или обходной путь очень ценятся. Спасибо. :)

Похоже, функция выполняется немедленно, и вы получаете либо :onClick=undefined (приводит к недопустимой ошибке обработчика), либо :onClick = "true" (приводит к тому, что handler.apply не является функцией). Просто предположение, хотя

Moritz Ringler 04.02.2023 14:45

@MoritzRingler казалось, что он выполняется сразу, а не по щелчку. я должен попытаться сделать функцию асинхронной? Но почему вы думаете, что он не выполняется ТОЛЬКО по клику?

nouf alsalem 04.02.2023 18:15

Если сделать функцию асинхронной, способ ее вызова здесь не изменится. Я предполагаю, что это должно быть что-то onClick = {'onCategorySelect(' + index + ')'}, но это может быть настолько глупо, насколько это выглядит, я не знаком с TSX.

Moritz Ringler 04.02.2023 18:27

@MoritzRingler, ха-ха, нет проблем, но чего ты пытаешься достичь этим прохождением? например, зачем передавать пробелы / как это будет выглядеть в обычном синтаксисе vue и js? Я попробую применить его к синтаксису TSX

nouf alsalem 04.02.2023 18:30

Обычно вы передаете строку onCategorySelect(index), и компилятор шаблона Vue определяет, что onCategorySelect — это метод компонента, а index — переменная в текущей области. Затем он создает обратный вызов для события click.

Moritz Ringler 04.02.2023 18:36

@MoritzRingler Ах, нет, с TSX он обычно работает с синтаксисом, который я использовал. Я использую onClick все время, как в вопросе, проблема возникает только с этим чертовым ZChip, и он выбран boolean. В любом случае, я пытался передать его как строку по-вашему, в любом случае это не имело значения. Однако, спасибо

nouf alsalem 04.02.2023 18:44
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
2
6
85
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы уже разобрались? Я не могу это проверить, но я уверен, что это работает, это соответствует тому, как индексы обрабатываются в React (на самом деле):

  methods: {
    onCategorySelect(index: number): void {
      () => this.registerCategory[index].is_selected = true;
    },
  }

Я понял это, но вы в основном правы! Однако я сделал выражение функции стрелки внутри onClick, поскольку другая часть проблемы заключалась в том, что я поместил массив в блок computed, а вычисляемые массивы не могут быть изменены. Я подробно описал это в своем собственном ответе, если вам интересно, но выбрал свой как правильный, потому что он также работает и имеет ту же идею, и вы старались изо всех сил помочь, так что спасибо! :')

nouf alsalem 05.02.2023 19:52

Подробно отвечая на мой вопрос на случай, если это кому-то понадобится - с помощью моего руководителя я понял, что в моем коде были проблемы с двумя вещами:

  1. Я тупо поместил массив в объект computed (потому что -- поправьте меня, если я ошибаюсь -- насколько я знаю, массивы с пользовательскими типами не могут быть определены в объекте data, а что-либо в блоке computed может' t быть мутированным. Поэтому я переместил массив в тот же класс, что и остальная часть моего кода (где находятся элементы ZChip). Я уверен, что есть какое-то лучшее место для инициализации массива, отличное от того, куда я его поместил, но да ладно .

  2. В onClick мне пришлось использовать выражение arrow function для вызова функции. Вот как был изменен код:

      {this.registerCategory.map((field, index) => (
        <ZidChip
        position = "start"
        id = {'field-' + index}
        value = {field}
        selected = {this.registerCategory[index].is_selected}
        onClick = {() => this.onCategorySelect(index)}
        >
          {this.$t(this.registerCategory[index].name)}
        </ZidChip>
      ))}
    

Где onCategorySelect выглядит так:

  private onCategorySelect(index: number): void {
    this.registerCategory[index].is_selected = !this.registerCategory[index].is_selected;
  }

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