Vue で親の値が変わったら子コンポーネントも更新する

Vue で親が子コンポーネントに対して値を渡す場合、以下のように props を介して渡します。

index.html

<!-- 子コンポーネント -->
<script type="text/x-template", id="child">
  <div>
    <input v-model="message">
    <a>Child message is: {{ message }}</a>
  </div>
</script>

<div id="example">
  <!-- 親 -->
  <input v-model="message">
  <a>Parent message is: {{ message }}</a>

  <!-- 子 -->
  <!-- props の value に対して親の data を渡す -->
  <child :value="message"></child>
  <child :value="message"></child>
  <child :value="message"></child>
</div>

index.js

Vue.component('child', {
    template: "#child",
    props: ["value"],
    // props は直接 bind できないので data として定義する
    data(){
        return { message: this.value };
    }
})


new Vue({
    el: '#example',
    data: {
        message: "homu"
    },
})

https://jsfiddle.net/Lufwscyz/

上記の場合は、

<child :value="message"></child>

の部分で、親の messagechild コンポーネントに渡しています。
また、props は書き換える事ができないので、

data(){
    return { message: this.value };
}

と言う風に data() を使用することで messageバインディングすることができます(あとそれぞれのコンポーネント間ではバインディングしたくなかったので。

親が書き換わった時に子の値も変える

上記のようなケースで、『親の message が変更された場合に child コンポーネントmessage も書き換えたい』みたいな事がやりたかったのでやってみました。
とりあえず、いいやり方は思い浮かばなかったので『親から子のメソッドを呼び出す』ことで解決してみることに…。

index.html

<script type="text/x-template", id="child">
  <div>
    <input v-model="message">
    <a>Child message is: {{ message }}</a>
  </div>
</script>

<div id="example">
  <!-- v-on:change を使用して update を行う -->
  <!-- v-on:change は『フォーカスが外れた時』に発火するので注意 -->
  <input v-model="message" v-on:change="update">
  <a>Parent message is: {{ message }}</a>


  <!-- $refs から呼び出せるように ref 属性を設定しておく -->
  <child :value="message" ref="child1"></child>
  <child :value="message" ref="child2"></child>
  <child :value="message" ref="child3"></child>
</div>

index.js

Vue.component('child', {
    template: "#child",
    props: ["value"],
    data(){
        return { message: this.value };
    },
    methods: {
        // message を更新する
        update(){
            this.message = this.value;
        }
    }
})


new Vue({
    el: '#example',
    data: {
        message: "homu"
    },
    methods: {
        update(){
            // refs を利用して各 child のメソッドを呼び出す
            this.$refs.child1.update();
            this.$refs.child2.update();
            this.$refs.child3.update();
        }
    }
})

https://jsfiddle.net/Lufwscyz/1/

上記のように $refs を利用して child コンポーネントのメソッドを呼び出しています。
今回は結構極端な例だったんですが、フォームをコンポーネント化した際にフォームデータを親から渡す場合にどうするのがいいのかでハマりました。
実際、どうするのがいいんだろうか…。

参照