Vue3の基本3(コンポーネント間のデータ受け渡し)

目次

(参考資料)
・Vue3 日本語ドキュメント
 https://v3.ja.vuejs.org/
・Vue.js3超入門(掌田津耶乃著)秀和システム

1.Vueの動作環境
(1)動作環境
 ・Windows 10 Pro
 ・XAMPP Control Panel v3.2.4 
 ・Node.js v16.13.0

2.プロジェクトの作成
(1)Viteツールを使ったプロジェクトの作成
 > npm init vite-app sample-app
 > cd sample-app
 > npm install

(2)プロジェクトの実行
  > npm run dev

 前編(Vue3の基本2)に続き、プロジェクトファイルを使ったVueアプリケーションの作成を行います。

3.親子間のコンポーネントのデータ受け渡し
(1)概要
 コンポーネント間のデータの受け渡しを通して、Vueの機能について確認します。

・コンポーネント内のHTML(テンプレート)にデータを表示するとき、テンプレートの外でデータを設定するときは、Vueに渡すオブジェクトのdata()メソッドに変数を記述する。
・コンポーネントを使う側で子コンポーネントのタグに属性としてデータを渡すときは、子コンポーネントのオブジェクトのpropsプロパティに変数を記述しておく。
さらにコンポーネントを使う側でタグに属性として渡すデータをテンプレートの外で設定するときは、テンプレート側の変数をオブジェクト側の変数にバインド「v-bind:(オブジェクト側の変数)=”(テンプレート側の変数)”」する必要がある。
・$emit()メソッドを使い、子コンポーネントから親コンポーネントにカスタムイベントと引数を通知することができる。
 親コンポーネント側ではv-on (カスタムイベント)でコンポーネント内のオブジェクトのメソッドを起動する。

(2)作成するアプリケーション
 text1、text2の表示は各々のコンポーネント内のVueオブジェクトで設定、親コンポーネント(App)は子コンポーネントを使い、その属性text3に”message”を設定し、子コンポーネント側で表示します。
 子コンポーネントで入力したテキストを「click」ボタンを押したイベント名とともに親コンポーネントに通知します。

(3)ソースリスト
 index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <link rel="icon" href="/favicon.ico" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Vite App</title>
</head>
<body>
  <div id="app"></div>
  <script type="module" src="/src/main.js"></script>
</body>
</html>

 main.js

import { createApp } from 'vue'
import App from './App.vue'
import './index.css'

createApp(App).mount('#app')

 App.vue

<template>
  <p>{{text1}}</p>
  <hello 
    v-bind:text3="message"
    v-on:c-event="appAction"
  />
  <p>{{text4}}</p>
</template>

<script>
import hello from './components/hello.vue'

export default {
  name: 'App',
  components: {
    hello
  },
  data(){
    return {
      text1:'親コンポーネントを表示します',
      message:'親側でtext2属性に設定したメッセージです',
      text4:'子コンポーネントで入力したテキストが入る場所'
    }
  },
  methods:{
    appAction(m_input){
      this.text4='子コンポーネントの入力:'+m_input
    },
  }    
}
</script>

 hello.vue

<template>
  <p> {{text2}} </p>
  <p> {{text3}} </p>
  <input type=text v-model="input">
  <button v-on:click="bton">Click</button>
  <p>子コンポーネントのテンプレート・・ここまで</p>
</template>

<script>
export default {
  name: 'hello',
  props: ['text3'],
  data(){
    return{
      text2:'子コンポーネントのテンプレート・・はじまり',
      input:'テキストを入力してClickしてください!'
    }
  },
  methods:{
    bton(){
      this.$emit('c-event',this.input)  //親にイベントを通知し、入力フォームの値を引数で渡す
    }
  }
}
</script>

アプリケーションの起動
 > npm run dev

最初にアクセス、またはリロードしたとき

入力フォームからテキストを入力して「Click」したとき

The end