How to do final state injection with Vue SRR with V8Js

断了今生、忘了曾经 提交于 2021-01-29 19:28:57

问题


The Vue SSR guide is mainly written for running a nodejs server and just touches on using V8Js in the final chapter.

It does have a section on final state injection but this doesn't work in the context of V8Js.

How can we pass the Vuex state from server to client side when using V8Js?


回答1:


First in entry-server.js we need to print not just the app, but also the Vuex state.

import { createApp } from './app'

new Promise((resolve, reject) => {

    const { app, router, store } = createApp()

    router.push(url)

    // Wait until router has resolved possible async components and hooks.
    router.onReady(() => {
        const matchedComponents = router.getMatchedComponents()

        // No matched routes, reject with 404.
        if (matchedComponents.length === 0) {
            return reject({ code: 404 })
        }

        resolve(app)

    }, reject)
})
    .then(app => {

        renderVueComponentToString(app, (err, res) => {

            // Only now the app has rendered and all components have had a chance to 
            // populate the Vuex store can we set the initial state.
            const initialState = JSON.stringify(app.$store.state)
            print(`<script>window.__INITIAL_STATE__ = ${initialState}</script>\n\r`)

            // Print the markup for the app.
            print(res)
        })
    })
    .catch((err) => {
        print(err)
    })

And then in entry-client.js we need to populate the Vuex store with that data:

import { createApp } from './app'

const { app, router, store } = createApp()

if (window.__INITIAL_STATE__) {

    // Initialize the store state with the data injected from the server.
    store.replaceState(window.__INITIAL_STATE__)
}

router.onReady(() => {
    app.$mount('#app')
})


来源:https://stackoverflow.com/questions/62192057/how-to-do-final-state-injection-with-vue-srr-with-v8js

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!