【问题标题】:Nuxt.js Loading data serverside with nuxtServerInit and VuexNuxt.js 使用 nuxtServerInit 和 Vuex 加载数据服务器端
【发布时间】:2019-04-04 15:06:46
【问题描述】:

目前我正在为一个职位空缺应用程序存储数据。 对于后端,我使用 Laravel,对于前端,我使用 Nuxt.js 我是 Nuxt 的新手,所以我有点卡在以下问题上。

我有一个页面用于创建一个名为 new-job.vue 的新职位空缺。我还创建了一个名为 jobs.js 的商店来处理状态。

在 new-job.vue 上,我有一个表单,其中包含必须在表单开始之前呈现在列表中的数据。就像所有国家/地区的列表等...以便我在表单中选择它们。

此时我在 new-job.vue 的导出默认值中使用 asyncData:

<script>
export default {

    asyncData(context) {
        return context.app.$axios
            .$get('jobs/create')
            .then(data => {
                //context.store.dispatch('jobs/getTypes', data.types)
                context.store.dispatch('jobs/getPlatforms', data.platforms)
                context.store.dispatch('jobs/getCountries', data.countries)data.branches)

                // return {
                //     loadedPost: { ...data, id: context.params.postId }
                // }composer required barr
            })
            .catch(e => context.error(e))
    },
     computed: {
         types () { return this.$store.state.jobs.types },
         platforms () { return this.$store.state.jobs.platforms },
         countries () { return this.$store.state.jobs.countries },

    },
}

asyncData 方法有效,类型、平台和国家/地区的列表正在填充来自数据库的数据,并且来自 Vuex 存储的状态得到更新。 .只有数据在客户端呈现。

我更喜欢在服务器端加载这些数据,所以我正在查看 nuxtServerInit。只有有人可以向我解释我如何才能做到这一点。

我在 new-job.vue 的导出默认值中放置了一个异步调用:

     async nuxtServerInit ({ commit, state }, { app }) {
        let res = await axios.get(`jobs/create`)

        console.log(res)
        commit('setPlatforms', res.data.platforms)
        commit('setTypes', res.data.types)
        commit('setCountries', res.data.countries)
    },

我在 jobs.store 的突变中创建了提交,但状态没有更新。

我做错了什么和/或我错过了什么?

或者也许是另一个问题,nuxtServerInit 是要走的路吗?还是在客户端加载这些数据列表没什么大不了的?

更新:

我为商店使用模块模式,所以我创建了一个名为jobs.js 的商店。在这个文件中,我也尝试调用 nuxtServerInit,但没有得到任何响应。

nuxtServerInit(vuexContext, context) {
    return context.app.$axios
        .$get('jobs/create')
        .then(data => {
            console.log(data)
        })
        .catch(e => context.error(e))
},

【问题讨论】:

  • 请澄清此声明:I tried an async call within the export default from new-job.vue。你把nuxtServerInit放在哪里了?
  • 我把 nuxtServerInit 放在 new-job.vue 中

标签: javascript vue.js vuex nuxt.js vuex-modules


【解决方案1】:

来自 Nuxt.js 文档中的 nuxtServerInit API 参考:

如果在 store 中定义了动作 nuxtServerInit,Nuxt.js 将使用上下文调用它(仅从服务器端)。

换句话说,它是一个仅在store/index.js 文件中可用的保留存储操作,如果已定义,将在呈现请求的路由之前在服务器端调用。

只有asyncDatafetch 方法在页面中可用。

【讨论】:

  • 感谢您抽出宝贵时间发表评论。我使用我在 jobs.js 存储文件中使用的 nuxtServerInit 调用更新了我的帖子。你可能有一个简单的 nuxtServerInit 调用我可以使用,所以我可以看看是否有一些响应?
  • nuxtServerInit 只能在store/index.js 文件中使用,如上所述。它可以是一个导出单个操作的文件,但它仍然可以工作。无法在其他地方调用nuxtServerInit,即使在其他商店模块中也是如此。
  • 好的,这就解释了为什么它不起作用。我认为您可以在每个商店中调用 nuxtServerInit。谢谢你说清楚:) 然后我稍微改述一下这个问题,并问你是否必须为表单中的输入字段生成列表(所有国家的列表等),asyncData 方法是一个好方法吗那?还是您会使用其他解决方案?
  • 如果上面提到的列表对于应用程序来说是必不可少的,没有它们加载页面就没有意义,那么我建议使用nuxtServerInit 来填充存储。否则,我会建议使用页面组件的fetch 方法来填充商店,只是因为可以在vuex中缓存数据并避免在应用程序内部导航时发出额外的请求。这可以通过在向 API 发出请求之前检查存储中是否存在数据来完成。
  • 再次感谢您的评论。我将尝试查看是否可以使 fetch 方法正常工作。从一开始就加载列表并不是必需的。就在创建工作页面打开列表时需要在那里。
猜你喜欢
  • 2019-07-22
  • 2021-11-19
  • 2022-06-15
  • 2018-12-18
  • 2021-03-11
  • 2021-06-20
  • 2019-02-27
  • 1970-01-01
  • 2016-06-11
相关资源
最近更新 更多