2017-11-07 9 views
1

現在、webview内で実行されているハイブリッドWebアプリケーションを実装しており、vue-cli webpackテンプレートとvuexに基づくアーキテクチャを使用することに決めました。Vue.jsを準備する前の初期化ロジックFrontend

コンテナアプリケーションでは、フロントエンドを準備するために起動時に呼び出す必要があるAPI(ウィンドウオブジェクトにエクスポートされたAPI)がいくつか用意されています。さらに、アプリケーションを初期化している最中に2時間まで実行する必要があります。

このinitロジックをmain.js内で実行することを計画しています。私たちのAPIは約束事に基づいているので、約束がすべて解決された後でVueインスタンスを作成します。これは良いアプローチのように聞こえるか、より良いテクニックの提案がありますか?

+0

は、なぜあなたはVueのインスタンスを作成して待つのでしょうか?インスタンスを作成し、 'mounted'または' created'ライフサイクルから呼び出しを完全にうまく始めることができます。単にVueインスタンスから必要なものを待つのはなぜですか?あなたの決定の裏に特定の推論がありますか? –

+0

@ Stephan-vあなたのアイデアは素晴らしいと思いますが、同様のことを考えましたが、統合されたログパネルがすべてのログを確実に収集できるようにできるだけ早くコンソールを上書きする必要があります。最初にvue.jsを初期化してエラーが発生した場合、そのログパネルには印刷できません。私が知る限り、作成されたライフサイクルはブロックされていません。つまり、あらゆる非同期操作がある場合、すべての約束が解決されたときにフラグを設定し、if-bindingを使用して実際のコンテンツをレンダリングする必要があります。これをどうやって解決しますか? – jimmy

答えて

1

コメントの後に私はポイントを得ました。しかし、あなたはまだ単一のモジュールであなたの「トレーラー」と「postvue」の手順を統合することができます。

// External function in module 
 
function initializeApp (vueCreated) { 
 
    return new Promise((resolve, reject) => { 
 
    switch (vueCreated) { 
 
     case false: // "prevue" initialization steps 
 
     console.log('vue not yet created, prevue steps happens') 
 
     // ... 
 
     setTimeout(_ => resolve(), 3500) // async call 
 
     break; 
 
     case true: // we can continue/prepare data for Vue 
 
     console.log('vue created, but waiting for next initialization steps and data') 
 
     // ... 
 
     setTimeout(_ => resolve('Mounted/shown when app ready'), 3500) // async call 
 
     } 
 
    }) 
 
} 
 

 
initializeApp(false).then(_ => { 
 
    new Vue({ 
 
    template: '#app', 
 
    data: { 
 
     content: null 
 
    }, 
 
    async created() { 
 
     this.content = await initializeApp(true) 
 
     this.$mount('#app') 
 
     console.log('all inicialization steps done, data arrived, vue mounted') 
 
    } 
 
    }) 
 
})
.fade-enter { opacity: 0; transform: translateY(30px) } 
 
.fade-enter-active { transition: all .4s }
<template id="app"> 
 
    <transition name="fade" appear> 
 
    <p>{{ content }}</p> 
 
    </transition> 
 
</template> 
 

 
<script src="https://unpkg.com/[email protected]/dist/vue.min.js"></script>

+0

ありがとう!少なくとも私のxhrでは、これははるかにクリーンな解決策になります。だから、最初にコンテナAPIを呼び出して、コンソールを上書きするかどうかを決定し、次にvueを初期化し、xhrを提案したように実行します。 – jimmy

+0

@jimmy厳密に... initializationApp()モジュールでは何もせず、Vueインスタンスがresolve()を待つようにします。オプションで、初期化から必要なデータを使ってresolve()することもできます。オプションでVueでreject()を捕まえて、これを破壊することもできます。$ destroyなどこれはかなり明確な宣言型のアプローチです。 – WaldemarIce

+0

@jimmyあなたのコメントの後、私は答えを書き換えました。見てみましょう、あなたはそれが好きです:) – WaldemarIce

関連する問題