Доступ к nuxt $ store внутри динамического компонента - PullRequest
0 голосов
/ 20 марта 2019

Я разрабатываю модальный компонент, основанный на Promise, который предоставляет возможность указывать компонент как тело самого модала.Чтобы достичь этого результата, я подумал, что хорошим решением будет использование динамического компонента внутри модального шаблона.Однако внутри приложения NUXT, если компонент ссылается на экземпляр Vuex (this. $ Store), он оказывается неопределенным (или, что лучше, атрибута объекта $ store нет).Точно так же любая инъекция, выполняемая внутри плагинов, приводит к неопределенности (например, inject ('api', api) создает атрибут $ api, но это приводит к неопределенности).Если я просто использую компонент «стандартным» способом (например, помещая его на страницу или в другой шаблон компонента), все работает нормально.

Должна быть некоторая «дополнительная инъекция», которую я должен сделать перед передачейкомпонент программным способом.

Кто-нибудь может мне помочь?

Структура проекта NUXT (упрощенная):

  • / pages / index.vue
  • / plugins / api.js
  • / store / auth.js
  • / components / HelloComponent.vue

/ plugins / api.js

let api = {}

api.call = function (request, auth, unpack, axios = this.axios) {
  if (!request) Error('backend.js:call invalid params:', request, auth, unpack, axios)

  if (auth) {
    if (request.headers)
      request.headers['Authorization'] = 'Bearer ' + this.auth.accessToken
    else
      request.headers = { 'Authorization': 'Bearer ' + this.auth.accessToken }
  }
  return axios(request).then((response) => unpack ? response.data : response)
}

api.getAPI = function (api, params, auth = true, unpack = true) {
  if (!api) Error('api.js:getAPI invalid params:', api)
  console.log('api.js:getAPI api:', api)
  return this.call({ method: 'get', url: api, params: params }, auth, unpack)
}

api.postAPI = function (api, params, data, auth = true, unpack = true) {
  if (!api) Error('api.js:postAPI invalid params:', api, data)
  console.log('api.js:postAPI api:', api)
  return this.call({ method: 'post', url: api, params: params, data: data }, auth, unpack)
}


/*******************************************************/
/*         NUXT plugin and reference injection         */
/*******************************************************/

export default function (context, inject) {

  console.log('[CALL] api.js')

  /* assign global $axios instance */
  api.axios = context.$axios

  /* assign auth instance to access tokens */
  api.auth = context.store.state.auth

  /* inject backend reference into application instance */
  inject('api', api)
}

/ pages / index.vue

<template>
  <div>
  
    <span>
      {{ $store.auth.state.name }} // -> Displays 'Chuck'
    </span>
    
    /* Object.keys(this).includes('$store): false'; Object.keys(this).includes('$auth): true' */
    <component :is="cComponent" /> // -> this.$store is undefined; auth: undefined
    
    <hello-component /> // -> Displays 'Chuck'; auth: Object {...}
  </div>
</template>

<script>
import HelloComponent from '../components/HelloComponent.vue'
export default {

  components: {
    HelloComponent
  },
  
  created () {
    this.$store.commit('auth/setName', 'Chuck')
  },
   
  computed: {
    cComponent () {
      return HelloComponent
    }
  }
}
</script>

/ components / HelloComponent.vue

<template>
  <span>
    {{ $store.auth.state.name }}
  </span>
</template>

<script>
export default {

  created() {
    console.log('auth:', this.$auth)
  }
  
}
</script>

/ store / auth.js

export const state = () => ({
  accessToken: null,
  refreshToken: null,
  name: null,
})

export const mutations = {

  setAccessToken(state, token) {
    console.info('auth.js:setAccessToken', token)
    state.accessToken = token
  },

  setRefreshToken(state, token) {
    console.info('auth.js:setRefreshToken', token)
    state.refreshToken = token
  },

  setName(state, name) {
    console.info('auth.js:setName', name)
    state.user = name
  },

}

1 Ответ

0 голосов
/ 21 марта 2019

если у вас нет доступа к этому указателю в проекте Nuxt, и вам действительно нужно получить доступ к store , тогда просто используйте окно

.nuxt. $ store вместо this. $ store ;

Надеюсь, это решит вашу проблему

...