Vue3 基本構文
Vue.js はプログレッシブ JavaScript フレームワークであり、主にユーザーインターフェースを構築するために使用されます。
Vue.js は、コンポーネント化とリアクティブデータの理念に基づき、ユーザーインターフェースを構築するためのシンプルで効率的な方法を提供します。
Vue 単一ファイルコンポーネント
Vue 単一ファイルコンポーネント(Single File Component、略称 SFC)は Vue.js フレームワークのファイル形式であり、開発者が HTML、JavaScript、CSS コードを1つのファイルに配置できるようにします。通常は.vueをファイル拡張子とします。
単一ファイルコンポーネントは再利用可能なコードの編成形式であり、同じコンポーネントに属する HTML、CSS、JavaScript を.vue拡張子のファイル内にカプセル化します。
以下は、テンプレート構文、ディレクティブ、イベント処理、算出プロパティ、コンポーネントなどを含む、Vue.js の一般的な基本構文と概念です。詳細については後の章で説明します。
1. Vue インスタンスの作成
Vue インスタンスの作成は Vue.js を使用し始める最初のステップです。通常、HTML ファイル内で Vue インスタンスを作成し、それを DOM 要素にマウントします。
インスタンス
{{ message }}
</div>
<script>
const HelloVueApp = {
data() {
return {
message: 'Hello Vue!!'
}
}
}
Vue.createApp(HelloVueApp).mount('#hello-vue')
</script>
試してみる »
HTML 部分の説明:
<div id="hello-vue" class="demo">:
- これは
<div>要素であり、id がhello-vueと class がdemo。 - Vue アプリケーションでは、この
<div>は Vue インスタンスによって管理され、データが変更されるとコンテンツが更新されます。
{{ message }}:
- これは Vue.js のテンプレート構文であり、Vue インスタンス内の
messageデータをページにバインドします。 - Vue インスタンス内の
messageデータが変更されると、ページ上のコンテンツもそれに応じて更新されます。
JavaScript 部分の説明:
Vue インスタンスの定義:
const HelloVueApp = {
data() {
return {
message: 'Hello Vue!!'
}
}
}HelloVueAppは、Vue コンポーネントのオプションを含む通常の JavaScript オブジェクトです。data()メソッドは、messageプロパティを含むオブジェクトを返します。このプロパティの初期値は'Hello Vue!!'。
Vue アプリケーションの作成とマウント:
Vue.createApp()メソッドは Vue アプリケーションインスタンスを作成するために使用されます。引数はコンポーネントオプションを含むオブジェクトです(ここではHelloVueApp)。.mount('#hello-vue')メソッドは Vue アプリケーションインスタンスを、ページ内でid="hello-vue"を持つ DOM 要素にマウントします。
実行プロセス
- ページ読み込み時に、ブラウザは HTML と JavaScript を解析します。
- Vue.js スクリプトの実行時に、Vue アプリケーションインスタンスが作成され、
<div id="hello-vue">要素にバインドされます。 - Vue アプリケーションインスタンスは、
data()内の初期データに基づいて、messageの値をページ上の{{ message }}にレンダリングします。 - 当
messageデータが変更されると(ユーザーの操作や非同期操作などにより)、ページは自動的に更新され、これらの変更を反映します。
2. テンプレート構文
補間
Vue.js は二重中括弧{{ }}を使用してテキスト補間を表します:
インスタンス
ディレクティブ
ディレクティブは接頭辞v-を持つ特別な属性であり、テンプレート内でロジックを表現するために使用されます。
v-bind:1つ以上の属性、またはコンポーネントの prop を動的にバインドします。
<a v-bind:href="url.html">Link</a>
省略記法:
<a :href="url.html">Link</a>
v-if / v-else-if / v-else:条件付きレンダリング。
<p v-if="visible">内容可见</p> <p v-else>内容不可见</p>
v-for:リストレンダリング。
<ul>
<li v-for="item in items" :key="item.id">{{ item.text }}</li>
</ul>
v-model:双方向データバインディング。
<input v-model="message" placeholder="edit me">
<p>Message is: {{ message }}</p>
v-on:イベントリスナー。
<button v-on:click="doSomething">Click me</button>
省略記法:
<button @click="doSomething">Click me</button>
3. イベント処理
Vue.js では、v-on ディレクティブを使用して DOM イベントをリッスンし、トリガーされたときに JavaScript コードを実行できます。
インスタンス
<button @click="greet">Greet</button>
</div>
<script>
createApp({
methods: {
greet() {
alert('Hello!');
}
}
}).mount('#app');
</script>
4. 算出プロパティ
算出プロパティは、依存関係に基づいてキャッシュされるプロパティです。算出プロパティは、関連する依存関係が変更された場合にのみ再計算されます。
インスタンス
<p>{{ reversedMessage }}</p>
</div>
<script>
createApp({
data() {
return {
message: 'Hello'
};
},
computed: {
reversedMessage() {
return this.message.split('').reverse().join('');
}
}
}).mount('#app');
</script>
5. コンポーネント
コンポーネントは Vue.js の最も強力な機能の1つです。コンポーネントを使用すると、小規模で独立した、通常は再利用可能なコンポーネントを使用して大規模なアプリケーションを構築できます。
インスタンス
app.component('my-component', {
template: '<div>A custom component!</div>'
});
コンポーネントの使用
インスタンス
<my-component></my-component>
</div>
<script>
const app = createApp({});
app.component('my-component', {
template: '<div>A custom component!</div>'
});
app.mount('#app');
</script>
6. Props とイベント
Props
Props は、コンポーネント間でデータを渡すために使用されます。
インスタンス
<blog-post title="My journey with Vue"></blog-post>
</div>
<script>
const app = createApp({
data() {
return {};
}
});
app.component('blog-post', {
props: ['title'],
template: '<h3>{{ title }}</h3>'
});
app.mount('#app');
</script>
イベント
子コンポーネントは$emitを使用してイベントをトリガーし、親コンポーネントはこれらのイベントをリッスンできます。
インスタンス
<button-counter @increment="incrementTotal"></button-counter>
<p>Total clicks: {{ total }}</p>
</div>
<script>
const app = createApp({
data() {
return {
total: 0
};
},
methods: {
incrementTotal() {
this.total++;
}
}
});
app.component('button-counter', {
template: '<button @click="increment">You clicked me {{ count }} times.</button>',
data() {
return {
count: 0
};
},
methods: {
increment() {
this.count++;
this.$emit('increment');
}
}
});
app.mount('#app');
</script>