2016-07-20 14 views
8

ブログポストの表示/編集を可能にするVueJSアプリを考えてみましょう。適切なvueJSデータと小道具を同期する方法

  • "blogpostを編集"をクリックすると、現在のblogpost(通常のjsオブジェクト)を編集するためのモーダル(Vueコンポーネント)が表示されます。
  • 私は現在のblogpostをpropとしてmodal-componentに渡します。
  • Modalコンポーネントには、blogpost-attributesで設定する必要があるフォームフィールドがいくつかあります。
  • しかし、Vue 'way'は、ユーザーがフォームフィールドを変更したときに更新されるように、フォームフィールドを作成するモデルとして機能するModalコンポーネント上にdataオブジェクトを持つことです。

問題:ブログ投稿は、フォームフィールド

  • ブログ投稿を移入

    • :どのように私はそのようモーダル成分のdata分野へpropとして渡されるブログ投稿を接続してくださいフォームフィールドの更新時に更新される

    これを行うには正しいVue方法はありますか?

  • 答えて

    1

    あなたはそれをやっての3(少なくとも)の方法があります:あなたがやっているのと同様に、prop属性を介してデータを接続し、それに.sync属性を追加

    1)。このようにして、フォーム上のデータが変更されると、コンポーネント上で自動的に変更されます。この解決策の問題点は、更新が自動的であることです。検証が失敗した場合や、ユーザーが変更を保存せずにモーダルを閉じた場合、これらは保存されます。例:https://jsfiddle.net/Lz3aq64f/

    2)それは保存されますときにそれを行うための他の方法は、保存された情報とイベントを$dispatchするモーダルを得ています。 blogpost要素はこのイベントをリッスンし、それに応じて動作する必要があります。ブログ投稿のコンポーネントとモーダル・コンポーネントは、同じ階層にない場合は、物事はもう少し複雑になります

    this.$on('update-post', function(title, author) { 
        this.title = title; 
        this.author = author 
    }); 
    

    、および:ブログ投稿で

    this.$dispatch('update-post', this.title, this.author); 
    

    :モーダルで

    おそらく、プロキシとして機能するためには、共通の親要素が必要です。 modal要素dispatchingを考えてください。#app要素は$onでキャッチしてから、$broadcastblogpost要素に渡します。

    3)vuexのようなものを使用して、状態の中央リポジトリとして機能します。私はあなたのアプリケーションがどれだけ大きいか分かりませんが、これは最もきれいな方法です:http://vuex.vuejs.org/en/index.html

    幸運!

    +1

    オプション4(gitter vuejsチャットに基づいています)が動作しているようです。これはすべての小道具が自動的に 'data'の一部であることに基づいています(ここでは' sync'は必要ありません)。したがって 'blogpost'(普通のオブジェクト)という小道具があれば、blogpostを''です。これはあなたのオプション1と同じ警告で、更新が直ちに行われるので、 'blogpostOld'を残しておくか、取り消し時に再びマージするものがあることを確認する必要があります。素晴らしい概要をありがとう。 –

    +0

    はい、 'props'、' data'と 'computed'は同様の性質を持っています。しかし、わかっている限り、アイテムに小道具を渡すと、その関係は片方向(親の変更が子供に渡されます)です。 '.sync'を使うと、関係は' two-way'になります。子のデータの変更によって親も変更されます:https://vuejs.org/guide/components.html#Prop-Binding-Types –

    +1

    'sync'を定義せずに意図された双方向振る舞いを見ています。これは、文字列のような単純な型の代わりにオブジェクト参照を渡しているためです。 –

    関連する問題