【问题标题】:Async data change when using server side render in Vue在 Vue 中使用服务器端渲染时异步数据更改
【发布时间】:2016-11-11 03:54:35
【问题描述】:

我想在服务器端渲染中使用Vue,但是模板内的内容数据必须从其他CMS服务器请求。

<template>
  <h1>{{ content.heading }}</h1>
</template>

<script>
  export default {
    data() {
      return {
        content: {
          heading: ''
        }
      }
    },
    created() {
      axios
        .get(CONTENT_RESOURCE)
        .then(content => this.content = content);
    }
  }
</script>

由于axios.get是异步请求,服务器会在请求完成前发送空内容。

使用 curl 请求内容:

curl 'URL';
# It got <h1></h1>,
# but I want <h1>Something here</h1>

如何确保它可以与服务器端的 CMS 内容数据一起呈现?

【问题讨论】:

  • 这不行吗?
  • 当我使用curl时,它只是得到&lt;h1&gt;&lt;/h1&gt;,而不是&lt;h1&gt;Page Title&lt;/h1&gt;

标签: javascript vue.js vue-router server-side-rendering


【解决方案1】:

vue-hackernews-2.0为例,src/server-entry.js会检测到当前路由组件中的preFetch函数。

所以,只需在当前路由组件中添加一个preFetch 函数并将数据保存到 Vuex 存储。

<template>
  <h1>{{ content.heading }}</h1>
</template>

<script>
  const fetchContent = store => 
    axios
      .get(CONTENT_RESOURCE)
      .then(content => store.dispatch('SAVE_CONTENT', content));

  export default {
    computed: {
      content() {
        return this.$store.YOUR_CONTENT_KEY_NAME
      }
    },
    preFetch: fetchContent,   // For server side render
    beforeCreate() {          // For client side render
      fetchContent(this.$store);
    }
  }
</script>

【讨论】:

    【解决方案2】:

    您必须在代码中进行以下更改:

    var demo = new Vue({
        el: '#demo',
        data:{
             content : {heading: ""}
        },
        beforeMount() {
          var self = this;
          setTimeout(function(){
              self.content.heading = "HI"
          }, 100)
        }
    })
    

    这是一个有效的fiddle

    【讨论】:

    • 那个是ES6箭头函数,不需要创建self变量。
    • 是的,它确实可以在客户端工作,但我想要服务器端渲染。
    • 你为什么要把content变成一个全局变量?
    • 啊,这里是fiddle,但未将其设为全局变量。
    • @saurabh 我认为他的意思是服务器端,它只在客户端工作
    猜你喜欢
    • 2016-07-04
    • 1970-01-01
    • 2019-03-27
    • 1970-01-01
    • 1970-01-01
    • 2018-12-13
    • 2018-03-29
    • 2021-07-23
    • 1970-01-01
    相关资源
    最近更新 更多