コンポーネントは便利ですが、データの受け渡し方法を理解することで、より便利に使用することができます。
props(親→子:値を渡す)
props: [プロパティ1, [プロパティ2], ...]
親コンポーネントから子コンポーネントへ、値(文字列、数値、配列やオブジェクトなど)を渡すためにはprops
を使用します。
ただし、子コンポーネントから親コンポーネントへ値を渡すことはできません。
また、props
で受け取ったデータを子コンポーネント内で変更することもできません。子コンポーネント側でデータが変更できてしまうと、複雑な構造になってくると、どこでデータが変更されたか親コンポーネント側で把握しにくなるのでこのような仕組みになっているようです。
今回は例として、以下のlist
という値を渡してみます。
list: {
item1: "str1",
item2: "str2",
item3: "str3"
}
子コンポーネントでprops
を設定します。今回はprop
という名前でプロパティを設定します。
props: ['prop', 'prop2'],
template: `
<p>
prop:{{ prop }}<br>
prop2:{{ prop2 }}
</p>
`
};
親コンポーネントで値を渡します。子コンポーネントでprop
と言う名前でprops
を設定したので、prop
というカスタム属性としてデータを渡すことができます。(list
をコンポーネントのdata
から呼び出すため:prop (v-bind:prop)
となっています。※直接値を渡すなら:
は不要です。)
<component-child :prop="list" prop2="Hello World!"></component-child>
$emit(子→親:イベント通知)
$emit(カスタムイベント名, [引数1], [引数2], ...)
子コンポーネントから親コンポーネントに対してのカスタムイベントを発生させるには$emitを使用します。
子コンポーネントでボタンがクリックされた時など、何らかの処理が行われた時に$emitを呼び出します。するとイベントが発生し、親コンポーネント側でデータを変更するのに必要なデータをイベントの引数として渡すことができます。
親コンポーネント側ではイベントの発生を検知し、イベントの引数でデータを受け取ることで、親コンポーネント内のデータを変更することができるようになります。
今回は例としてクリックイベントを介して、hoge
という文字列を渡してみます。
まず子コンポーネントのクリックイベントで$emitを使用し、click-event
という名前のカスタムイベントを設定し、引数として文字列hoge
を渡します。
<button class="c-btn" @click="$emit('click-event', 'hoge')" type="button">click!</button>
親コンポーネントでは子コンポーネントで設定したカスタムイベントclick-event
を呼び出し使用したいメソッドを設定します。ここではcallHoge
というメソッドを設定しています。
methods: {
callHoge: function(data) {
alert(data);
}
},
template: `
<div>
<component-child
@click-event="callHoge"
></component-child>
</div>
`
子コンポーネントの$emit
の引数で設定した文字列hoge
が、親コンポーネントのメソッドcallHoge
に値として渡されているはずです。
デモ
See the Pen テスト | Vue.js (v2.x) by Ex-365 (@excreative) on CodePen.