Предварительная выборка данных Vue из отдельного бэкенда

#javascript #vue.js #prefetch

Вопрос:

У меня есть несколько запросов от API-сервера, который возвращает объект json, который будет статичным в течение сеанса пользователя, но не будет статичным навсегда. Это один пейджер с маршрутизатором Vue.

Как я могу добиться этого я: могу получить доступ к этому.myGlobals (или аналогичному, например, window.myGlobals) во всех компонентах, где хранятся мои предварительно выбранные json-данные с API-сервера.

Мой подход, который уже работает, заключается в том, чтобы внедрить help.js через миксин.

Как ни странно, я получаю сотни звонков на этот запрос. Сначала я думал, что это происходит только во внешнем интерфейсе и кэшируется, но на самом деле запросы отправляются на сервер сотни раз. Я думаю, что это ошибка моего мышления или систематическая ошибка.

я думаю, проблема в том, что helper.js не является статичным, живущим в экземпляре vue

main.js:

 import helpers from './helpers'
Vue.mixin(helpers)
 

helpers.js:

 export default {
    data: function () {
        return {
            globals: {},
        }
    }, methods: {
       //some global helper funktions
        },
    }, mounted() {


        let url1 = window.datahost   "/myDataToStore"
        this.$http.get(url1).then(response => {
            console.log("call")
            this.globals.myData = response.data
        });
    }
}
 

консоль входа в систему:

 call
SomeOtherStuff
(31) call
SomeOtherStuff
(2) call 
....
 

войдите на сервер:

 call
call
call (pew pew) 
 

Моей следующей идеей было бы изучить vuex, но поскольку это простая проблема, я не уверен, действительно ли мне нужна эта бомба ?

Ответ №1:

Для этого вы можете использовать плагин.

 // my-plugin.js

export default {
  install (Vue, options) {

    // start fetching data right after install
    let url1 = window.datahost   "/myDataToStore"
    let myData
    Vue.$http.get(url1).then(response => {
      console.log("call")
      myData = response.data
    })

    // inject via global mixin
    Vue.mixin({
      computed: {
        myData () {
          return myData
        }
      }
    })

    // or inject via instance property
    Vue.prototype.$myData = myData

    // or if you want to wait until myData is available
    Vue.prototype.$myData = Vue.$http.get(url1)
      .then(response => {
        console.log("call")
        myData = response.data
      })
  }
}
 

и используйте его:

 Vue.use(VueResource)
Vue.use(myPlugin)
 

Комментарии:

1. Спасибо за вашу помощь и советы, это сработало немедленно. важно отметить, что .прототип.свойство x.