inputフォームをコンポーネント分割する際、「あれ、値の受け渡しってどうしたらいいんだ??」となったので調べたことをこちらに簡単にまとめたいと思います。
詰まった点は、これまでinput要素に入力された値を取得するときv-modelで取得してたけどコンポーネント分けたらできなくなるよね?というところでした。
結論: v-modelのままだと値は取得できない
通常のデータバインディングであればv-modelを使うことで実現できます。しかし、親子コンポーネント間で値を受け渡すときはそれでは動きません。
解決策: 取得方法
v-modelの代わりにv-bind:value(:value)とv-on:input(@input)で取得します。
ファイル構成
MainPage.vue(親)
FormInput.vue(子)
子コンポーネントの作成
子コンポーネントのinput要素に@inputと:valueをセットします。
そして、@inputで受け取った入力をevent引数で受け取ると同時にgetInputDataメソッドを発火、$emitの第二引数に値をセットして親コンポーネントに送るよう記述します。
$emitは単体だと親コンポーネントのメソッドを子コンポーネントから発火したりできますが、第二引数を指定することで親にデータを受け渡す役割も担います。
<template>
<div>
<input type="text" @input="getInputValue" :value="value" />
</div>
</template>
<script>
export default {
props: {
value: String,
},
data() {
return {
showInputData: "",
};
},
methods: {
getInputValue($event) {
this.$emit("inputValue", $event.target.value);
},
},
};
</script>
親コンポーネントの作成
親コンポーネントでは先程送られてきた値をinputDataメソッドの引数として受け取りthis.showInputDataへ代入します。
<template>
<div>
<FormInput :value="data" @inputValue="inputData" />
{{ showInputData }}
</div>
</template>
<script>
import FormInput from "./FormInput";
export default {
components: {
FormInput,
},
data() {
return {
data: "",
showInputData: "",
};
},
methods: {
inputData(value) {
this.showInputData = value;
},
},
};
</script>
これでinputで入力された値を無事親コンポーネントで表示することができました。