Как связываешь legacy код jQuery с Vue.js

Ответ

Для интеграции jQuery с Vue.js можно использовать несколько подходов:

  1. Использование хуков жизненного цикла Vue
    В mounted инициализируем jQuery-плагины, а в beforeDestroy очищаем их:
    mounted() {
      this.$nextTick(() => {
        $(this.$el).pluginName(); // Инициализация плагина
      });
    },
    beforeDestroy() {
      $(this.$el).pluginName('destroy'); // Очистка
    }
  1. Обертки для jQuery-компонентов
    Создаем Vue-компонент-обертку:
    Vue.component('jquery-wrapper', {
      template: '<div ref="jqElement"></div>',
      mounted() {
        $(this.$refs.jqElement).datepicker();
      }
    });
  1. Глобальное подключение
    Если jQuery используется для вспомогательных функций (например, AJAX), можно подключить его через window.$ и использовать в любом месте приложения.

Важно:

  • Избегайте прямого манипулирования DOM через jQuery внутри Vue-компонентов
  • Используйте $nextTick для работы с DOM после его обновления Vue
  • Для сложных интеграций рассмотрите постепенный рефакторинг на нативные Vue-решения

Ответ 18+ 🔞

Слушай, а вот это реально интересный вопрос, про который многие ломают голову. Представь: у тебя есть старый, проверенный, но местами обоссанный jQuery-плагин, который делает какую-то магию. А проект уже на Vue. И вот ты сидишь и думаешь: «Ну как же их, блядь, подружить, чтобы не взорвалось?»

Так вот, есть несколько способов, и все они — как танцы на минном поле. Нужно аккуратно, а то пидары налетели в виде конфликтов и утечек памяти.

Первый способ — через хуки жизни. Самый частый, но требует дисциплины, как у сапёра. Ты в компоненте пишешь:

mounted() {
  // Вот тут важно! Дождись, пока Vue отрисует всё нахуй.
  this.$nextTick(() => {
    // Теперь твой элемент готов, можно навешивать jQuery-пиздюли.
    $(this.$el).someFancyPlugin({ option: 'value' });
  });
},
beforeDestroy() {
  // А вот это, чувак, ВАЖНЕЙШЕЕ! Если не почистишь — получишь утечку памяти, и приложение будет жрать оперативку, как свинья.
  // Смотри в документации плагина, как его правильно убить.
  $(this.$el).someFancyPlugin('destroy');
}

Смысл в том, что mounted — это «ой, всё, я в DOM-е», а beforeDestroy — «щас меня выпилят, надо за собой убрать».

Второй способ — обёртка. Если плагин — это целый виджет (типа календаря или слайдера), можно сделать для него отдельный Vue-компонент-конверт.

Vue.component('jquery-datepicker', {
  template: '<div ref="widgetRoot"></div>', // Просто болванка, куда всё встроится
  mounted() {
    // Вешаем плагин на этот самый ref
    $(this.$refs.widgetRoot).datepicker({
      onSelect: (date) => {
        // А вот так можно пробросить событие наружу, в мир Vue.
        this.$emit('date-selected', date);
      }
    });
  },
  beforeDestroy() {
    $(this.$refs.widgetRoot).datepicker('destroy');
  }
});

И потом в шаблоне пишешь <jquery-datepicker @date-selected="handleDate" />. Красота, ёпта!

Третий способ — глобальный. Если тебе от jQuery нужны только $.ajax или какие-то утилиты — просто подключи его через window.$ и юзай где угодно. Vue на это особо не обидится, потому что ты не лезешь в его священный DOM.

НО, ВНИМАНИЕ, ГЛАВНЫЕ ПРАВИЛА, ЧТОБЫ НЕ БЫЛО ПИЗДЕЦА:

  1. Не лезь в DOM через jQuery там, где Vue сам им рулит! Это как пытаться переключить передачу в машине, пока её толкают с горки — доверия ебать ноль. Vue не узнает про твои изменения, и в следующем обновлении всё похерится. Работай только с тем элементом, на который навесил плагин.
  2. Всегда используй $nextTick. Vue обновляет DOM асинхронно. Если ты в mounted сразу начнёшь цеплять плагин, может оказаться, что элемента ещё нет, и твой код накрылся медным тазом.
  3. Чисти за собой! beforeDestroy — твой лучший друг. Не оставляй таймеры, слушатели событий и прочую хуйню.
  4. И главное — подумай, а оно тебе надо? Может, уже есть нативный Vue-компонент, который делает то же самое, но без этих пиздопроебибен? Постепенный рефакторинг — путь джедая.

Вот так вот, чих-пых тебя в сраку, и живём. Главное — не смешивать два подхода в одной кучке, а то получится каша, от которой сам от себя охуеешь.