前置き
前回はinput
やtextarea
などで
基本的な使い方を解説しました!
今回は親子間での使い方がメインです🌟
基本的な使い方
親子間でv-model
をやるには工夫が必要です!
v-model
はこれと同じです💡v-bind:value
, v-on:input
値は親から受け取るprops
イベントは子自体のイベントなので
親に通知するための$emit
を使用します💡
親で入力した値を
子のinput
にも反映させています👀
directory
components/
--| atom/
----| inputs/
-----| InputDefault.vue
pages/
--| index.vue
解説
InputDefault.vue
- v-bind:value="value"
value属性をvalueプロパティにバインド
valueはpropsで値を親からもらう - @input="$emit('input', $event.target.value)"
└@input:inputした時(イベントハンドラ )
└$emit('input'):子のイベント名inputを親に伝える
https://note.com/aliz/n/nd6e771724cd7
└$event.target.value:
イベントが起きる(入力イベント)要素(input)の値を取得
入力した値を取得できるってことです🌟
$emitの第二引数で使えます!
コード
) components
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<template> <input :value="value" @input="$emit('input', $event.target.value)" > </template> <script lang="ts"> export default { props: { value: { type: String, // ここは影響しない default: 'ハロー' } }, } </script> |
またはv-model
のような属性自体を親に渡すv-bind="$attrs"
でもOK⭕️
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<template> <input v-bind="$attrs" @input="$emit('input', $event.target.value)" > </template> <script lang="ts"> export default { props: { value: { type: String, // ここは影響しない default: 'ハロー' } }, } </script> |
) pages
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<template> <div class="page"> <form @submit.prevent> <InputDefault v-model="message" /> <button @click="submit(message)" > 送信 </button> </form> </div> </template> <script> import InputDefault from '~/components/atom/inputs/InputDefault.vue' export default { components: { InputDefault, }, data () { return { message: 'メッセージ', } }, methods: { submit (message) { console.log(message) }, }, } </script> |
コンポーネントにネイティブイベントをバインディング
子にあるinput
のイベントを
親で使いたい時にどうするのか、
という話です!
.native修飾子
をv-on
につけます🌟
通常はinput
タグのイベントなので@input
で良いのですが.native
の違いを分かりやすくするために@keyup
イベントを使用してみます🍒🙋♀️
イベントの違い
input: 文字を入力した時(ctlとかは反応しない)
keyup: キーを押して話したとき(どのキーでも反応する)
.nativeあり
@keyupイベント
(キーを離した時)を
親で検知してmethods
を発火させ
テキストを更新しています🌟
コード
) components
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<template> <input v-bind="$attrs" v-on:input="$emit('input', $event.target.value)" > </template> <script lang="ts"> export default { props: { value: { type: String, default: 'ハロー' } }, } </script> |
) pages
@keyup.native.enter
enterキーを離した時
@keyup.enter.nativeではダメなの?
それでもOKです!
ただnativeはv-onの修飾子のため
v-on:keyupの直後につけています!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<template> <div class="page"> <InputDefault v-model="value" @keyup.native.enter="pushItem" /> <p>{{ value }}</p> </div> </template> <script> import InputDefault from '~/components/atom/inputs/InputDefault.vue' export default { components: { InputDefault, }, data () { return { value: '', } }, methods: { pushItem () { this.value = 'pushItem!' }, }, } </script> |
.nativeなし
methods
が発火しません、、、
コード
.native
ありのコードから.native
を取るだけです!
まとめ
v-model
はv-bind:value
, v-on:input
をまとめて書ける
糖衣構文(syntax sugar)でしたね💡
あとは親子間でのデータやイベントの
受け渡しprops
, $emit
が分かれば
構造は把握できますね🤗
分からない所があれば
知りたい単語を右のサイドバーから
検索してみてください✨🔍