当前位置: 首页 > 知识库问答 >
问题:

VueJS服务器端渲染:计算属性在存储中未看到更改

暴绪
2023-03-14

我正在尝试让服务器端渲染在VueJS中工作。

我一直在关注官方文档,我正在尝试使用axios来实现这个示例。endpoint是正确的,数据确实显示在突变中。

https://ssr.vuejs.org/guide/data.html

我还找到了这个页面,并尝试了其中的大多数示例,包括使用getters、vuex mapState、mapGetter等:

vue。js 2如何从vuex查看存储值

这里是存储/索引。js

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

import { fetchPage } from './api'

export function createStore () {
    return new Vuex.Store({
        strict: true,

        state: () => ({
            res: {}
        }),

        actions: {
            actXY ({ commit }, page) {
                fetchPage('homepage').then((item) => {
                    commit('mutXY', { page, item });
                }).catch(error => {
                    throw new Error(`Store ${error}`);

                })
            }
        },

        mutations: {
            mutXY (state, { page, item }) {
                Vue.set(state.res, page, item);
                console.log(state.res.homepage.data)

            }
        },

        getters: {
            getXY (state) {
                return state.res
            }
        }
    })
}

控制台日志显示了正确的信息,这意味着axiosendpoint正在工作并更新状态对象。最初,我试图调用变异,但后来我尝试调用getter。不幸的是,getter中没有更新新数据,因此当然,组件中没有显示任何新数据。

这是主页。vue

<template>
  <div v-if="htmlData">{{ JSON.stringify(htmlData) }}</div>
  <div v-else>loading?</div>
</template>

<script>
export default ({
    name: 'homepage',

    computed: {
        htmlData () {
            console.log("computed = " + JSON.stringify(this.$store.state.res));
            console.log(this.$store.getters.getXY);
            return this.$store.getters
            // return this.getQuery()
        }
    },

    serverPrefetch () {
        return this.getData()
    },

    mounted () {
        console.log("in mounted")
        if (!this.item) {
            this.getData()
        }
    },

    methods: {
        getData () {
            return this.$store.dispatch('actXY', 'homepage')
        }
    }
})

</script>

如前所述,htmlData将显示:

{"getXY":{}}

是的,我在getter中尝试了许多其他的方法来返回store项,,但是没有任何效果。

除了上面链接中的内容外,我还查看了配置文件的变化,我尝试添加async来存储/actions、getData()等。

我还试图在组件中直接调用axios,但没有成功。

由于这个项目已经在VueJS中或多或少地完成了,我正在转换为SSR,所以我删除了package.json的所有内容,并重新安装了每个包,希望可能是某个旧的vue包引起了冲突。

我还尝试了从官方文档中分离存储代码,并尝试了路由编写方式的变化。什么都不管用。

我想我应该添加运行当前代码时打印语句显示的内容:

computed = undefined
computed mm  = undefined
getter = {}
computed get  = {"getXY":{}}
{
  title: 'Home'...}

组件中的计算属性在设置突变之前运行。这导致在更新突变之前调用getter。同样,如果我试图直接从组件调用对res的更改,则在调用和呈现存储时没有任何突变。

这是我试图运行的代码的一个副本:https://github.com/dt1/vue-ssr-attempt

(我找到了答案。我已经用对我有效的方法更新了回购协议,下面对我的解决方案进行了解释)


共有3个答案

全昊焜
2023-03-14
匿名用户

我的问题是为什么调用this.getData()挂载?

如果我正确理解了这个过程,当您调用服务器端渲染时,您正试图在安装vue组件之前渲染超文本标记语言。如果你调用this.getData()创建而不是挂载,它会工作吗?

我会尝试的其他事情:

  1. 硬编码htmlData组件中的值,以检查它是否会呈现
  2. 如果工作,硬编码htmlData值在存储和检查组件是否可以获取该存储数据和渲染正确太
  3. 之后,通过组件的调度从服务器获取htmlData,看看它是否工作。
  4. 如果(3)不起作用,尝试将htmlData推送到仅在准备好htmlData时才创建的子组件,通过props将htmlData发送到子组件

公西俊才
2023-03-14

开箱即用的Vue.js没有SSR。在您的示例中,您可以获取客户端上的数据。

请尝试以下商店示例:

export default new Vuex.Store({
  strict: true,
  state: {
    res: null
  },
  getters: {
    getXY(state) {
      return state.res;
    }
  },
  mutations: {
    mutXY(state, payload) {
      state.res = payload;
    }
  },
  actions: {
    actXY: function(store) {
      fetchPage("homepage")
        .then(res => {
          store.commit("mutXY", res);
        })
        .catch(error => {
          throw new Error(`Store ${error}`);
        });
    }
  }
});

您可以在组件中获取如下数据

  computed: {
    htmlData() {
      return this.$store.getters.getXY;
    }
  },
  created() {
    this.getData();
  },
  methods: {
    getData() {
      return this.$store.dispatch("actXY", "homepage");
    }
  }
方璞
2023-03-14

首先storeData()=

然后返回这个$百货商店状态项目。主页数据=

 类似资料:
  • info 如果您能了解下面这些技术,能加快您对本文的了解 vuex - Vue.js 应用程序开发的状态管理模式 Vue.js SSR - Vue.js 服务器端渲染 webpack - 编译构建工具 Lavas 服务器端渲染模板参考了 vue-hackernews 的渲染和开发机制,并且结合了 Lavas 的 App Shell 模板,导出的工程中会有 App Shell 等 如果您不了解 vu

  • React 提供了两个方法 renderToString 和 renderToStaticMarkup 用来将组件(Virtual DOM)输出成 HTML 字符串,这是 React 服务器端渲染的基础,它移除了服务器端对于浏览器环境的依赖,所以让服务器端渲染变成了一件有吸引力的事情。 服务器端渲染除了要解决对浏览器环境的依赖,还要解决两个问题: 前后端可以共享代码 前后端路由可以统一处理 Rea

  • 如果你调研服务器端渲染(SSR)只是用来改善少数营销页面(例如/,/about,/contact等)的 SEO,那么你可能需要预渲染。无需使用 web 服务器实时动态编译 HTML,而是使用预渲染方式,在构建时(build time)简单地生成针对特定路由的静态 HTML 文件。优点是设置预渲染更简单,并可以将你的前端作为一个完全静态的站点。 如果你使用 webpack,你可以使用prerende

  • 问题内容: 我刚刚开始研究ReactJS,发现它为您提供了两种渲染页面的方法:服务器端和客户端。但是,我不知道如何一起使用。是使用两种单独的方法来构建应用程序,还是可以将它们一起使用? 如果可以一起使用,该如何做- 我们是否需要在服务器端和客户端重复相同的元素?或者,我们是否可以仅在服务器上构建应用程序的静态部分,而在客户端构建动态部分,而无需与已经预先渲染的服务器端建立任何连接? 问题答案: 对

  • 我刚刚开始研究ReactJS,发现它提供了两种呈现页面的方法:服务器端和客户端。但是,我不明白如何一起使用它。构建应用程序有两种不同的方法,还是可以一起使用? 如果我们可以一起使用它,如何做到这一点——我们需要在服务器端和客户端复制相同的元素吗?或者,我们可以只在服务器上构建应用程序的静态部分,在客户端构建动态部分,而不与已经预渲染的服务器端建立任何连接吗?

  • 服务端渲染一个很常见的场景是当用户(或搜索引擎爬虫)第一次请求页面时,用它来做初始渲染。当服务器接收到请求后,它把需要的组件渲染成 HTML 字符串,然后把它返回给客户端(这里统指浏览器)。之后,客户端会接手渲染控制权。 下面我们使用 React 来做示例,对于支持服务端渲染的其它 view 框架,做法也是类似的。 服务端使用 Redux 当在服务器使用 Redux 渲染时,一定要在响应中包含应用

  • 准备动作 1、安装nodejs与安装express 安装nodejs教程:http://www.cnblogs.com/pigtail/archive/2013/01/08/2850486.html 安装 express 教程:https://www.wenjiangs.com/doc/f5jxm7ii 2、安装node-jsx(使nodejs支持jsx语法) $ npm install node

  • 实验性 SSR 支持还处于试验阶段,你可能会遇到 bug 和不受支持的用例。请考虑你可能承担的风险。 注意 SSR 特别指支持在 Node.js 中运行相同应用程序的前端框架(例如 React、Preact、Vue 和 Svelte),将其预渲染成 HTML,最后在客户端进行脱水化处理。如果你正在寻找与传统服务器端框架的集成,请查看 后端集成指南。 下面的指南还假定你在选择的框架中有使用 SSR