_.Debounce () Lodash не работает в Vue.js

Я пытаюсь запустить метод query() при изменении свойства компонента q в Vue.js.

Это не удается, потому что this.query() не определен. This относится к экземпляру моего компонента, но почему-то не содержит методов.

Вот соответствующая часть кода, где я пытаюсь просмотреть свойство компонента q и запустить функцию query():

methods: {
  async query() {
    const url = `https://example.com`;
    const results = await axios({
      url,
      method: 'GET',
    });
    this.results = results.items;
  },
  debouncedQuery: _.debounce(() => { this.query(); }, 300),
},
watch: {
  q() {
    this.debouncedQuery();
  },
},

Ошибка:

TypeError: _this2.query is not a function

Если я напишу вызов debounce(), как показано ниже, ошибка TypeError: expected a function появится еще раньше, при загрузке страницы.

debouncedQuery: _.debounce(this.query, 300),
Поведение ключевого слова "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) для оценки ваших знаний,...
11
0
11 322
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Проблема возникает из-за лексической области действия стрелочной функции, которую вы определяете в _.debounce. this привязан к объекту, в котором вы его определяете, а не к созданному экземпляру Vue.

Если вы отключите функцию стрелки для обычной функции, область видимости будет привязана правильно:

methods: {
  // ...
  debouncedQuery: _.debounce(function () { this.query(); }, 300)
}

Блин! Спасибо. Я был уверен, что попробовал и этот вариант. Оно работает

user6269864 29.10.2018 09:54

Отлично работает, но eslint жалуется на файлы .vue "no-invalid-this".

Jan Vorisek 21.04.2019 22:37

странно, использование этого точного синтаксиса не запускает this.query() для меня

Nando 01.07.2021 16:40

Мне нужно было связать это при создании, чтобы он работал, вероятно, как проблема @BuddyZ. data() { return { searchCustomersDebounced: null, },created() { this.debouncedQuery = _.debounce( () => { this.query(); }, 1000 );},

Brian Scramlin 02.08.2021 17:07

Мы можем сделать это с помощью простого JS (ES6) с несколькими строками кода:

function update() {

    if (typeof window.LIT !== 'undefined') {
        clearTimeout(window.LIT);
    }

    window.LIT = setTimeout(() => {
        // do something...
    }, 1000);

}

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