2016-11-11 4 views
2

サーバー側レンダリングでVueを使用したいただし、テンプレート内のコンテンツデータは他のCMSサーバーから要求する必要があります。Vueでサーバー側レンダリングを使用すると非同期データが変更される

<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 'URL'; 
# It got <h1></h1>, 
# but I want <h1>Something here</h1> 

は、どのように私はそれがサーバ側でのCMSのコンテンツデータをレンダリングすることができることを確認するのですか?

+0

これは機能しませんか? – Saurabh

+0

'curl'を使うと'

'で、'

ではありません。ページタイトル

Knovour

答えて

2

vue-hackernews-2.0の例によれば、src/server-entry.jsは、現在のルートコンポーネントで​​の機能を検出します。

したがって、​​関数を現在のルートコンポーネントに追加して、データを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> 
0

あなたは、コード内で次の変更を行う必要があります。ここでは

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

は作業fiddleです。

+0

これはES6の矢印機能であり、 'self'変数を作る必要はありません。 – Knovour

+0

はい、それは間違いなくクライアント側で動作しますが、サーバー側のレンダリングが必要です。 – Knovour

+0

なぜ、 'content'をグローバル変数にするのですか? – Knovour

関連する問題