2017-03-08 10 views
1

動的コンポーネントインスタンスを(テンプレートではなく)プログラムで作成する方法を見つける必要があります。動的に作成されたvueインスタンスで「コンポーネントのマウントに失敗しました:テンプレートまたはレンダリング関数が定義されていません」

私は解決策(それはそう)、単にエラーでnew Vue(..)結果を使用して、新しいVUE-インスタンスを作成する素朴な方法を発見したものの:

Failed to mount component: template or render function not definedを。

これは私には奇妙なことです。それはあまりにもそうである可能性があるからです。つまり、拡張されたvueクラスで定義されたテンプレートがあります。

以下のコードを参照してください.2つの方法、および動作しない現在の(コメントではない)コードがコメントアウトされています。

マイ不自然コード:

const HelloComponent = Vue.extend({ 
    template: '<p>Welcome home!</p>' 
    }); 

    const Home1 = { 
    template: '<p>Welcome home!</p>' 
    }; 

    const Home2 = { 
    extends: HelloComponent 
    }; 

    new Vue({ 
    el: '#app', 
    data() { 
     return { 
     // currentView: Home1 // does work 
     // currentView: Home2 // does work 
     currentView: new HelloComponent() //does NOT work. Why? 
     }; 
    }, 
    template: '<component :is="currentView"></component>', 
    }); 

答えて

1

componentコンポーネントに内蔵され、文字列、コンポーネントのコンストラクタ、またはコンポーネント定義オブジェクトを受け入れることができます。 Vue.extendsは、新しいコンポーネントコンストラクタ関数を作成します。あなたのコードを動作させるためには、それを作成した結果ではなく、コンストラクタ関数自体を渡す必要があります。本質的

currentView: HelloComponent 

new HelloComponent()の結果は、Vueのインスタンスの、コンポーネント定義オブジェクトまたはコンポーネントコンストラクタ関数ではありません。

+0

このソリューションでは、上記の「currentView:HelloComponent」という割り当てを行うたびに、私が望む新しいインスタンスは作成されません。 'currentView:{extends:HelloComponent}'は動作します。割り当てごとに新しいインスタンスを作成する必要がある場合は、この方法をお勧めしますか? –

+0

@ Geert-Janもう少し詳しく教えてください。私はcodepenで実験し、currentViewが設定されるたびに、新しいインスタンスを作成するように見えます。 http://codepen.io/Kradek/pen/YZNbJe?editors=1011 – Bert

+0

http://codepen.io/anon/pen/PppPRY?editors=1011を参照してください。あなたのペンとの違いは、最初に別のコンポーネントをロードせずに、同じコンポーネント(ただし別のインスタンス)をロードしたいということです。クリック時に 'currentView:TabPanel'を割り当てるが、別のデータが添付されたユースケース、例えば、複数のタブ。 –

関連する問題

 関連する問題