使用 Nuxt.js 从页面组件的 asyncData() 方法调用 mixin 函数

Call mixin function from asyncData() method of the page component with Nuxt.js

我可以使用 Nuxt.js 从页面组件的 asyncData() 方法调用 mixin 函数吗?

我的代码:

<template>
  ...
</template>
<script>
   import api from "@/plugins/api/api.js"

   ...

   export default {

      ...

      async asyncData(context) {
          ...
          context.apiMethodName()
          ...
      }

      ...
   }

   ...
</script>

api.js

import Vue from 'vue'
import API from '@/assets/js/api'

Vue.mixin({
  methods: {
    apiMethodName() { ... }
  }
})

你不能使用 asyncData 调用 vue 方法,因为在 vue 之前执行的 asyncData 有一个实例。

您可以将方法提取到简单的 js 函数中,并在 asyncData 和您的 vue 方法中调用它,但请记住,在 asyncData 中您将无法访问 vue 实例属性和其他方法

你可以在app中注入mixin,见https://nuxtjs.org/guide/plugins#inject-in-root-amp-context

您需要放弃使用 mixins 并改为注入您的方法。

首先;将您的 mixin 方法替换为

export default ({ app }, inject) => {
  inject('apiMethodName', () => {
    return 'some data!';
  })
}

然后,在asyncData()方法中,像这样调用apiMethodName()函数

async asyncData(context) {
  context.app.$apiMethodName();
})

我看到答案已经很晚了,但这是可能的。

template.vue

<template>
...
</template>
<script>
  import api from "~/mixins/api/api"
  ...

  export default {
    ...

    async asyncData({context}) {
      ...
      // You don't need to use context
      // You have to use "api" like this:
      const collection = await api.methods.apiMethodName()
      ...

      // bear in mind you should return data from this function
      return {
        collection,
        ...
      }
    }
    ...
  }
  ...
</script>

~/mixins/api/api.js

const api = {
  ...
  methods: {
    async apiMethodName() {
      ...
      // better use here try / catch or Promise with then / catch
      const data = await do_something()
      ...

      return data
    }
    ...
  }
  ...
}

export api

使用 stack VueJS + NuxtJS 测试了类似的方法,它正在实时网站上运行 https://elfinforce.com

您可以像这样访问全局混合方法:

app.router.app.gloablMethod()

就这么简单!