5
2

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 1 year has passed since last update.

【Vue.js】コンポーネントでv-modelを使う方法を図解で理解する。

Last updated at Posted at 2021-02-06

下記のような、type textのインプットフォームをv-modelを用いてコンポーネント化する。

<template>
  <div>
    <input type="text" v-model="title" />
    <p>{{ title }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      title: "",
    };
  },
};
</script>

まずEventTilteというコンポーネントを作成して、フォームをそちらにうつす。

App.vue
<template>
  <div>
    <EventTitle></EventTitle>
  </div>
</template>

<script>
import EventTitle from "./components/EventTitle.vue";

export default {
  data() {
    return {
      title: "",
    };
  },
  components: {
    EventTitle,
  },
};
</script>
EventTitle.vue
<template>
  <div>
    <input type="text" v-model="title" />
    <p>{{ title }}</p>
  </div>
</template>

コンポーネントタグにv-modelを設定する。

App.vue
<template>
  <div>
    <EventTitle v-model="title"></EventTitle>
  </div>
</template>

v-modelはコンポーネントタグに設定された場合、以下のような処理のシンタックスシュガーとなっている。

App.vue
<template>
  <div>
    <EventTitle :value="title" @input="title = $event"></EventTitle>
  </div>
</template>

つまり、inputイベントが発火した場合、イベントオブジェクトをdataのtitleに格納して、value属性をバインドして、titleと同期させている。

つまり、この処理を親と子の相互間でデーターを受け渡せるようにする。

IMG_311D4E5FF44B-1.jpeg

1 子コンポーネントでインプットイベント発火
2 $emitに登録されているinputイベントが発火する。
3 イベントオブジェクトで入力した値を取得し、親コンポーネントの$eventに送られて、titleに格納される。
4 dataのtitleと同期
5 value属性にtitle(入力された値)が格納される。

App.vue
<template>
  <div>
    <EventTitle :value="title" @input="title = $event"></EventTitle>
  </div>
</template>

<script>
import EventTitle from "./components/EventTitle.vue"

export default {
  data() {
    return {
      title: "",
    };
  },
  components: {
    EventTitle,
  },
};
</script>
EventTitle.vue

<template>
  <div>
    <input
      type="text"
      v-bind:value="value"
      v-on:input="$emit('input', $event.target.value)"
    />
    <p>{{ value }}</p>
  </div>
</template>

<script>
export default {
  props: ["value"],
};
</script>

シンタックスシュガーに置き換えた部分を、v-modelに戻す。

App.vue
<template>
  <div>
    <EventTitle v-model="title"></EventTitle>
  </div>
</template>

<script>
import EventTitle from "./components/EventTitle.vue";

export default {
  data() {
    return {
      title: "",
    };
  },
  components: {
    EventTitle,
  },
};
</script>
5
2
1

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
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?