2017-09-19 9 views
2

私が達成しようとしているもの

私が取り組んでいるアプリケーションの優れたアーキテクチャを理解しようとしています。VueJSコンポーネントシステムアーキテクチャ

screenshots of the current version of our applicationを見ると、さまざまな形式のデータの表/リストが表示されます。 2番目のスクリーンショットの表には、独自のナビゲーションがあります。場合によっては、表の行を選択できます。他の画面では、指定したキーワードで項目のリストをフィルタリングすることができます。

フロントエンドはVueJSで再構築されます。特定の画面ごとに1回限りのコンポーネントを作成するのではなく、アプリケーション全体で使用できるより汎用的なソリューションを用意したいと思います。

私が必要とするのは、ルートに一連のデータが含まれ、子がそのデータの表現を(おそらく複数の)表現するコンポーネントのシステムです。ルートコンポーネントには、主にユーザが指定した設定、フィルタ、および表示を制御するための選択が含まれています。

私が達成しようとしているのは、some pseudocodeで最もよく示されています。

質問

データを保存するにはどうすればよいですか?子コンポーネントはこのデータにどのようにアクセスする必要がありますか?

data-displayのデータを小道具で子供に渡すのは面倒です。特に表現にはこのデータへの暗黙的なアクセスがあるためです。

私はこれにVuexを使うべきですか?それはdata-displayの複数のインスタンスでどのように動作しますか?私は動的モジュールの登録について何かを読んだ、それは役に立つかもしれない?

良い方法がありますか?どんな助けでも大歓迎です!

答えて

1

私はあなたの要件のすべての詳細を把握していませんが、データがSPAの複数の「ページ」に共通することを理解しています。 は、私は間違いなくVuexをお勧めします:変更を保存することに反応しているだけでなく、依存関係

  • には変更は保存しない場合は 再計算を節約するために、キャッシュされたコンポーネントに計算プロパティ、 を経由してすべてのページ
  • アクセスのための

    • 同じデータを小道具(下を通す)と出来事(上を通過する)の潜在的に複雑な多くのデータの通過

    擬似コードを見ると、3つのタイプのフィルターがあります彼はサイドバー。そのデータをストアに入れると、ビューの計算されたプロパティでデータにフィルタを適用できます。計算ロジックは簡単に分離してテストされます。

    child.vue

    <template> 
        <div>{{ myChildData.someProperty }}</div> 
    </template> 
    
    <script> 
    export default { 
        props: [...], 
        data: function() { 
        return { 
         selection: 'someValue' // set this by, e.g, click on template 
        } 
        }, 
        computed: { 
        myChildData() { 
         return this.$store.getters.filteredData(this.selection) 
        } 
        } 
    } 
    </script> 
    

    店。JS

    const state = { 
        myData: { 
        ... 
        }, 
        filters: { // set by dispatch from sidebar component 
        keyword: ..., 
        toggle: ..., 
        range: ... 
        }, 
    } 
    
    const getters = { 
        filteredData: state => { 
        return childSelection => { // this extra layer allows param to be passed 
         return state.myData 
         .filter(item => item.someProp === state.filters.keyword) 
         .filter(item => item.anotherProp === childSelection) 
        } 
        }, 
    } 
    
    const mutations = { 
        'SET_DATA' (state, payload) { 
        ... 
        }, 
        'SET_FILTER' (state, payload) { 
        ... 
        } 
    } 
    
    export default { 
        state, 
        getters, 
        mutations, 
    } 
    

    ジェネリック子供

    はこれを取り組むために、おそらく多くの方法があります。私はコンポジションを使用しました。これは、一般的なコンポーネントを使用する各子のための薄いコンポーネントを意味しますが、子が特定のデータを持っている場合や、スロットに入れることができる独自のマークアップを持つ場合にのみ必要です。

    child1.vue

    <template> 
        <page-common :childtype="childType"> 
        <button class="this-childs-button" slot="buttons"></button> 
        </page-common> 
    </template> 
    
    <script> 
    import PageCommon from './page-common.vue' 
    export default { 
        props: [...], 
        data: function() { 
        return { 
         childType: 'someType' 
        } 
        }, 
        components: { 
        'page-common': PageCommon, 
        } 
    } 
    </script> 
    

    ページ-common.vue

    <template> 
        ... 
        <slot name="buttons"></slot> 
    </template> 
    
    <script> 
    export default { 
        props: [ 
        'childtype' 
        ], 
        data: function() { 
        return { 
         ... 
        } 
        }, 
    } 
    </script> 
    

    データの複数インスタンス

    ここでも、多くの変形例 - 私はインデックスとしての特性を持つオブジェクトを使用するので、ストアは

    store.js

    const state = { 
        myData: { 
        page1: ..., // be sure to explicitly name the pages here 
        page2: ..., // otherwise Vuex cannot make them reactive 
        page3: ..., 
        }, 
        filters: { // set by dispatch from sidebar component 
        keyword: ..., 
        toggle: ..., 
        range: ... 
        }, 
    } 
    
    const getters = { 
        filteredData: state => { 
        return page, childSelection => { // this extra layer allows param to be passed 
         return state.myData[page] // sub-select the data required 
         .filter(item => item.someProp === state.filters.keyword) 
         .filter(item => item.anotherProp === childSelection) 
        } 
        }, 
    } 
    
    const mutations = { 
        'SET_DATA' (state, payload) { 
        state.myData[payload.page] = payload.myData 
        }, 
        'SET_FILTER' (state, payload) { 
        ... 
        } 
    } 
    
    export default { 
        state, 
        getters, 
        mutations, 
    } 
    
    なります