Экземпляр VueJS вызывается, даже если элемент отсутствует на странице

1

Я сталкиваюсь с проблемой, когда вызываются все мои экземпляры VueJS, даже если элемент отсутствует на странице.

У меня есть mixin, объявленный таким образом.

var mixin = {
  methods: {
    listEvents(parameters) { 
      return axios.get('/api/v1/events', {params: parameters})
    },
    listLocations(parameters) { 
      return axios.get('/api/v1/locations', {params: parameters})
    },
  }
}

И несколько экземпляров, которые используют это смешивание. Если вы спросите, почему несколько экземпляров, это потому, что я использую VuejS на нескольких страницах. Например, у меня есть страница, на которой перечислены события и страница, на которой указаны местоположения. Итак, все мои методы находятся в mixin, а затем экземпляр, созданный для страницы, вызывается, потому что страница содержит элемент, указанный в экземпляре (например: id = "location" и el: "#locations")

Пример одного экземпляра:

// Vue
new Vue({
  el: '#locations',
  delimiters: ['[[', ']]'],
  mixins: [mixin],
  data: {
    locations: [],
    loading: true,
    error: false,
    page: 1,
    perPage: 20,
  },
  mounted: function () {
    console.log("VUEJS 'locations' has been mounted")
    this.init();
  },
  methods: {
    init() {
...
...

Но, независимо от того, на какой странице я нахожусь, все экземпляры вызываются... Я вижу все вызовы API, инициируются карты листовки, но контейнера нет... это беспорядок.

Я что-то пропустил или понял?

EDIT: Я могу добавить, что все экземпляры находятся в app.js и этот app.js включен во все страницы.

  • 0
    Итак, вы создаете экземпляр Vue на каждой странице и спрашиваете, почему Vue создается на каждой странице? При вызове new Vue(); Вы создаете экземпляр Vue.
  • 0
    Я не думаю, что это то, что спрашивает ОП. Они называют init в mounted . Насколько мне известно, mounted не должен вызываться, если корневого HTML-элемента не существует на странице.
Показать ещё 11 комментариев
Теги:
vue.js

1 ответ

1
Лучший ответ

Похоже, у вас есть сценарий, который загружается на каждую страницу, создавая новые объекты Vue, независимо от того, отображаются ли элементы, связанные с Vues.

Vue создаст экземпляры, даже если элемент, который вы его создаете, не существует.

В этом случае вы можете просто проверить, существуют ли элементы до создания Vue.

const locations = document.querySelector("#locations")
if (locations) {
  new Vue({
    el: "#locations",
    ...
  })
}
  • 0
    Спасибо за этот обходной путь. Но мне не нравится термин «обходной путь», потому что это означает, что то, чего я хочу достичь с помощью VueJS, не правильно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню