1.1 Vueのコンポーネントと基本構文
- コンポーネントとは何か
- Vueアプリケーションの基本構文
1.1.1 コンポーネントとは
Webページの構成パーツのことをコンポーネントと呼ぶ。
コンポーネントは以下の要素から出来ている。
- HTMLタグ
- CSSスタイルシート
- JavaScriptコード
1.1.2 単一コンポーネントファイルとは
Vueプロジェクトではコンポーネントを構成する3つの要素が1個のコンポーネントファイルにまとめられている。このようなファイルを単一コンポーネントファイルといい、拡張子を.vueとする
<script setup lang="ts">
// スクリプトブロック
// JavaScript (TypeScript) コードを記述する
</script>
<template>
<!-- テンプレートブロック -->
<!-- HTMLタブを記述する -->
</template>
<style>
/* スタイルブロック */
/* CSSコードを記述する */
</style>
中身は大きく次の3パートに分かれている
スクリプトブロック | scriptタグで囲まれた部分 | JavaScript(TypeScript)コードを記述する |
テンプレートブロック | templateタグで囲まれた部分 | HTMLタブを記述する |
スタイルブロック | styleタグで囲まれた部分 | CSSコードを記述する |
1.1.3 単一コンポーネントファイル記述の基本
<script setup lang="ts">
import {ref} from "vue"
const name = ret("山田太郎")
</script>
<template>
<h1>こんにちは!{{name}}さん!</h1>
</template>
スクリプトブロックの属性
属性 | 概要 |
---|---|
lang=”ts” | TypeScriptを表す。スクリプトブロックにTpyeScriptコードを記述する場合は必ずこの属性を指定する。 |
setup | Vueのバージョン2の記述方法Option APIの欠点を改善するために生まれたsetup()関数を利用するComposition APIを簡易的に記述できるようにしたもの。 |
1.1.4 データを表示するマスタッシュ構文
{{変数名}}
スクリプトブロックで用意した変数を表示するための構文
1.1.5 テンプレートに表示させる変数を定義するref()
テンプレートブロックで利用する変数(テンプレート変数)はスクリプトブロック内で変数として宣言するだけでよい。
ただし、値を ref() 関数の引数として渡して、その戻り値を変数に代入する。
const name = ref("山田太郎")
ref()関数は事前にVue.js本体からインポートしておく必要がある。
import {ref} from "vue"
1.2 リアクティブシステム
- ref()関数の働き
1.2.1 ref() の働き
リアクティブシステム
リアクティブとは変数の値の変化に連動して表示内容が自動的に変化することを表す。
リアクティブシステムは、このリアクティブを現実する仕組みのことで、Vueの根幹をなす。
<script setup lang="ts">
import { ref } from 'vue'
// 現在の時刻を取得
const now = new Date()
// 現在の時刻の文字列を取得
const nowStr = now.toLocaleDateString()
// 現在時刻文字列をテンプレート変数としてref()で用意
const timeStrRef = ref(nowStr)
// 新しい時刻に変更する関数
function changeTime(): void {
const newTime = new Date()
const newTimeStr = newTime.toLocaleTimeString()
timeStrRef.value = newTimeStr
}
// changeTime関数を1秒ごとに実行
// この関数により、1秒ごとにchangeTimeが実行され、
// timeStrRefが新しい時刻で更新される
setInterval(changeTime, 1000)
</script>
<template>
<!-- timeStrRefの値を表示 -->
<p>現在時刻: {{ timeStrRef }}</p>
</template>
1.2.2 リアクティブ変数の値の変更方法
ref() によって生成された変数の value プロパティの値を変更する必要がある。
const 変数名 = ref(値)
変数名.value = 新しい値
1.3 リアクティブデータ用意のバリエーション
リアクティブデータを用意する ref() 以外の方法
1.3.1 計算結果をリアクティブにする computed()
マスタッシュ構文には直接計算式を記述できる
<template>
<p>半径{{radius}}の円の面積を円周率{{PI}}で計算すると、{{PI * radius * radius}}</p>
</template>
しかしVueのコーディング規約では「マスタッシュ構文内で式を記述するのは極力避けるように」となっている。
スクリプトブロックで用意した変数や外部から与えられた変数を使って計算した結果をリアクティブデータとする場合、算出プロパティ(Computed Properties)という方法が利用できる。
<script setup lang="ts">
// vueからrefとcomputed関数をインポート
import { ref, computed } from 'vue'
// 半径の初期値を乱数で取得
const radiusInit = Math.round(Math.random() * 10)
// 円周率のテンプレート変数を用意
const PI = ref(3.14)
// 半径のテンプレートを用意
const radius = ref(radiusInit)
// 円の面積の算出プロパティを用意
const area = computed((): number => {
return radius.value * radius.value * PI.value
})
// 半径のテンプレート半数に新しい乱数を1秒ごとに格納
setInterval((): void => {
radius.value = Math.round(Math.random() * 10)
}, 1000)
</script>
<template>
<p>半径{{ radius }}の円の面積を円周率{{ PI }}で計算すると、{{ area }}</p>
</template>
const 変数名 = computed(
(): 計算結果のデータ型 => {
計算処理
return 計算結果
}
}
無名関数を利用したコードでは下記のようになるが、無名関数内ではthisが指すものがさまざまに変化し、Vueプロジェクト内でエラーになることが多いがめアロー式が推奨されている。
一方アロー式は可読性の問題があるので{}(波括弧)ブロックは必ず記述し、戻り値はreturnキーワードを記述するようにする。
const area = computed(
function(): number {
return radius.value * redius.value * PI.value
}
}
1.3.2 オブジェクトをまとめてリアクティブにする reactive()
複数のデータをひとつのオブジェクトとして扱い、それらをまとめてリアクティブにする関数
const data = reactive({
PI: 3.14,
radius: Math.round(Math.random() * 10)
})
setInterval(():void => { data.radius = Math.round(Math.random() * 10)}, 1000)
1.4 Vueプロジェクトの構成と動作原理
1.4.1 Vueプロジェクトのファイル構成
■ hello-vue プロジェクトルートフォルダ
│
├─■ .vscode VSCode用の設定ファイル
├─■ dist デプロイ用ファイルセットが格納されたフォルダ
├─■ node_modules ライブラリが格納されたフォルダ
├─■ public Webに公開するファイル類を格納するフォルダ
│ │
│ └─□ favicon.ico ファビコンファイル
│
├─■ src ソースコードファイルを格納するフォルダ
│ │
│ ├─■ assets 画像などのアセット類を格納するフォルダ
│ ├─■ components コンポーネントファイルを格納するフォルダ
│ ├─□ App.vue メインの単一コンポーネントファイル
│ └─□ main.ts メインのスクリプトファイル
│
├─□ .editorconfig エディタの設定ファイル
├─□ .gitignore Git管理から除外するファイルを設定するファイル
├─□ .prettierrc.json Prettierの設定ファイル
├─□ env.d.ts 環境変数を設定するファイル
├─□ eslint.config.js ESLintに関するファイル
├─□ index.html トップページ
├─□ package-lock.json npmの依存関係に関する設定ファイル
├─□ package.json npmに関する設定ファイル
├─□ README.md ReadMeファイル
├─□ tsconfig.app.json アプリケーションコードを TypeScript で書けるようにする
├─□ tsconfig.json TypeScriptに関する設定のベースになるファイル
├─□ tsconfig.node.json TypeScriptに関する追加の設定ファイル
└─□ vite.config.ts Viteに関する設定ファイル
1.4.2 デプロイ用ファイル一式が格納されたdistフォルダ
npm run build
1.4.3 publicフォルダとindex.html
publicフォルダ
Vue.jsの処理を介さず外部に公開したいファイル類はこのフォルダに格納する。
index.html
プロジェクト直下の index.html は build 処理によって改変され dist ファイルに格納される。
1.4.4 Vueプロジェクトの動作原理
index.html の <div id=”app”></div> が Vueアプリケーションの起点となる。
index.htmlから読み込まれるmain.ts
import { createApp } from 'vue' // Vue.js本体からcreateApp()関数をインポート
import App from '/App.vue' // App.vueファイルをインポート
import './assets/main.css' // main.cssファイルをインポート
createApp(App).mount('#app')
createApp(App).mount(‘#app’) によって Vueプロジェクトが動作し始める。
前半の createApp() は Vueアプリケーションを作成する処理。
後半の mount() は crearteApp() によって生成された Vueアプリケーションを表示するメソッドで、 index.html のどのタグに表示するかを引数として指定している。
結果、App.vueに記述されたな内容が index.html の #appタグ内にレンダリングされ表示される。
その後は必要に応じて App.vueから他の単一コンポーネントファイルを読み込むことでさまざまな表示・処理が行われるようになる。
通常、これらの App.vueから読み込まれるコンポーネントファイル類は src/componentsフォルダ内に格納する。
コメント