0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

input要素で親子間の値を受け渡す方法(Vue.js)

Posted at

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は単体だと親コンポーネントのメソッドを子コンポーネントから発火したりできますが、第二引数を指定することで親にデータを受け渡す役割も担います。

FormInput.vue
<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へ代入します。

MainPage.vue
<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で入力された値を無事親コンポーネントで表示することができました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?