watchプロパティで入力内容を即時反映する方法。子から親へのデータ受け渡し
watchプロパティで入力内容を即時反映する方法。子から親へのデータ受け渡し
watchプロパティを使うと画面上の変更内容をリアルタイムで検知し、設定した処理を実行することができる。
watchプロパティを使う手順
①変数を定義する
↓
②変数に対してwatachプロパティを設定する
watchプロパティは変数の変更を感知するため、変更内容を監視する変数を指定する。
※注意点
・watchプロパティの中で監視する変数を指定。
┗ 変数名:function(){処理}
・変数内のネストしたデータを監視する場合は追加設定が必要。
┗ 関数を「handler(){}」にする。
┗ 「deep: true」を設定する。
watchプロパティの使い方(ネストしてない変数の監視)
watch:{
プロパティ名: function(){
処理
}
}
実例
<template>
<div>
<v-col
cols="12"
sm="3">
<v-text-field
v-model="text" />
</v-col>
</div>
</template>
<script>
export default {
data(){
return{
//①監視する変数を定義
text: "初期値"
},
watch:{
//②変数に対してwatchプロパティを設定
//textの値が変わったら以下処理を実行。
text:
function (a){
this.$emit('childChange', a)
}
}
}
</script>
関数内のthis.$emit('childChange', a)
┗ 関数内でプロパティを自分の呼び出す場合はthisが必要。
┗ $emitは子から親にデータを渡す
┗ $emit('親に渡すメソッド名', 引数)
┗ 引数は任意
┗ 引数には監視している変数が入る
▼引数のメリット
引数を使わずにデータを指定して渡す方法もあるが、引数を使った記述の方がより簡易的。
watch:{
text:
function (a){
this.$emit('childChange', a)
}
}
watch:{
text:
function (){
this.$emit('childChange', this.text)
}
}
<template>
<v-app>
<TextField
<!--子からイベントを受け取り、親のイベントに引き継ぐ-->
@childChange="parentChange"
/>
<p>
・v-modelのデータ: {{text}}
</p>
</v-app>
</template>
<script>
import TextField from "./TextField"
export default {
name: "Parent",
components:{
TextField
},
data(){
return{
text:'初期値'
}
},
methods:{
//親のイベントを実行
parentChange(text){
this.text = text
console.log("text-filedが変更されました")
}
}
}
</script>
これで、text-fieldへの入力値がリアルタイムで反映される。
ネストした変数データの監視
変数がネストしている場合、以下2つの設定が必要。
(1) functionをhandlerに変更
(2) deep: true を設定
※watchプロパティの中が入れ子になるため、追加で{}が必要。
watch:{
プロパティ名:{
handler(){
処理
},
deep: true
}
}
実例
<template>
<div>
<v-col
cols="12"
sm="3">
<v-text-field
v-model="text.sub" />
</v-col>
</div>
</template>
<script>
export default {
data(){
return{
//①監視する変数を定義(入れ子)
text: {
first: "初期値",
sub: "subテキスト"}
}
},
watch:{
//②変数に対してwatchプロパティを設定
text:{
handler(a){
this.$emit('childChange', a)
},
deep: true
}
}
}
</script>
<template>
<v-app>
<TextField
<!--子からイベントを受け取り、親のイベントに引き継ぐ-->
@childChange="parentChange"
/>
<p>
・v-modelのデータ: {{text}}
</p>
</v-app>
</template>
<script>
import TextField from "./TextField"
export default {
name: "Parent",
components:{
TextField
},
data(){
return{
text:'初期値'
}
},
methods:{
parentChange(text){
//受け取った入れ子の変数のsubを使う
this.text = text.sub
console.log("text-filedが変更されました")
}
}
}
</script>
▼初期状態
▼文字入力後
文字を入力する毎に、親で設定したメソッドが実行されている。
変更があったタイミングでwatchが作動するため、初期値は反映されていない。
immediate: true
を追加で記述することで、初期値から反映することができる。
immediate: true
watch:{
text:{
//初期値からデータ連動
immediate: true,
handler(a){
this.$emit('childChange', a)
},
deep: true
}
}
}
Author And Source
この問題について(watchプロパティで入力内容を即時反映する方法。子から親へのデータ受け渡し), 我々は、より多くの情報をここで見つけました https://qiita.com/shizen-shin/items/d5549d128487f7dfd02a著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .