実践練習
ToDoリストアプリケーション
ToDoリストアプリケーションは、Vue 3の基本的な機能を学ぶのに最適なプロジェクトです。このアプリケーションを作成する過程で、Vue 3のComposition API、Vue Router、Vuexを使用した状態管理、そして基本的なCRUD(Create, Read, Update, Delete)操作を実践します。ここでは、<script setup>
構文を使用して、ToDoリストアプリケーションの基本的な構成を説明します。
プロジェクトのセットアップ
- Vue CLIを使用してプロジェクトを作成します。
vue create todo-app
- Vue RouterとVuexをインストールします。
cd todo-app vue add router vue add vuex
ToDoリストコンポーネント
以下は、ToDoリストの基本的なCRUD操作を行うコンポーネントの例です。この例では、Vue 3のComposition APIを使用しています。
<script setup>
import { ref } from 'vue';
const todos = ref([]);
const newTodo = ref('');
// ToDoを追加
function addTodo() {
if (!newTodo.value.trim()) return;
todos.value.push({ id: Date.now(), text: newTodo.value, completed: false });
newTodo.value = '';
}
// ToDoを削除
function deleteTodo(id) {
todos.value = todos.value.filter(todo => todo.id !== id);
}
// ToDoの完了状態をトグル
function toggleTodoCompletion(todo) {
todo.completed = !todo.completed;
}
</script>
<template>
<input v-model="newTodo" @keyup.enter="addTodo" placeholder="Add a new todo" />
<ul>
<li v-for="todo in todos" :key="todo.id">
<input type="checkbox" v-model="todo.completed" @change="toggleTodoCompletion(todo)" />
{{ todo.text }}
<button @click="deleteTodo(todo.id)">Delete</button>
</li>
</ul>
</template>
Vue Routerの統合
ToDoリストアプリケーションにおいて、Vue Routerを使用してページ遷移を管理します。src/router/index.js
を編集して、ルートを設定します。
import { createRouter, createWebHistory } from 'vue-router';
import Home from '../views/Home.vue';
import About from '../views/About.vue';
const routes = [
{
path: '/',
name: 'Home',
component: Home,
},
{
path: '/about',
name: 'About',
component: About,
},
];
const router = createRouter({
history: createWebHistory(process.env.BASE_URL),
routes,
});
export default router;
Vuexの統合
Vuexを使用して、ToDoリストの状態をグローバルに管理します。これにより、アプリケーション全体でToDoリストの状態を共有できます。
import { createStore } from 'vuex';
export default createStore({
state: {
todos: [],
},
mutations: {
addTodo(state, todo) {
state.todos.push(todo);
},
deleteTodo(state, todoId) {
state.todos = state.todos.filter(todo => todo.id !== todoId);
},
toggleTodoCompletion(state, todoId) {
const todo = state.todos.find(todo => todo.id === todoId);
if (todo) todo.completed = !todo.completed;
},
},
actions: {
addTodo({ commit }, todoText) {
const todo = { id: Date.now(), text: todoText, completed: false };
commit('addTodo', todo);
},
deleteTodo({ commit }, todoId) {
commit('deleteTodo', todoId);
},
toggleTodoCompletion({ commit }, todoId) {
commit('toggleTodoCompletion', todoId);
},
},
});
ブログアプリケーション
ブログアプリケーションの開発は、Vue 3の機能を深く理解するのに役立つ複雑なプロジェクトです。このプロジェクトでは、マークダウンエディタの統合、コメント機能の実装、そして認証と認可の仕組みを取り入れます。<script setup>
構文を使用してVue 3アプリケーションを構築する方法を見ていきましょう。
プロジェクトのセットアップ
- Viteを使用して新しいVue 3プロジェクトを作成します。
npm create vite@latest my-blog-app -- --template vue cd my-blog-app npm install
- Vue RouterとVuexをプロジェクトに追加します。
npm install vue-router@4 vuex@4
- マークダウンエディタとして
markdown-it
をインストールします。npm install markdown-it
マークダウンエディタコンポーネント
マークダウンエディタのためのコンポーネントを作成します。このコンポーネントは、ユーザーが入力したマークダウンテキストをリアルタイムでHTMLに変換し表示します。
<script setup>
import { ref } from 'vue';
import MarkdownIt from 'markdown-it';
const md = new MarkdownIt();
const markdownText = ref('');
const renderedHtml = computed(() => {
return md.render(markdownText.value);
});
</script>
<template>
<div class="markdown-editor">
<textarea v-model="markdownText" placeholder="Enter markdown text"></textarea>
<div v-html="renderedHtml" class="preview"></div>
</div>
</template>
<style>
.markdown-editor {
display: flex;
}
textarea {
width: 50%;
height: 300px;
}
.preview {
width: 50%;
padding: 20px;
border-left: 1px solid #ccc;
overflow-y: scroll;
}
</style>
コメント機能
コメント機能を実装するためには、各ブログ投稿に対してコメントを保存し、表示する機能が必要です。この例では、Vuexを使用してコメントデータを管理します。
import { createStore } from 'vuex';
export default createStore({
state: {
comments: {}
},
mutations: {
addComment(state, { postId, comment }) {
if (!state.comments[postId]) {
state.comments[postId] = [];
}
state.comments[postId].push(comment);
}
},
actions: {
addComment({ commit }, { postId, comment }) {
commit('addComment', { postId, comment });
}
}
});
認証と認可
認証と認可の実装には、Firebase AuthやAuth0などのサービスを利用するのが一般的です。ここでは、具体的な認証サービスの統合方法は説明しませんが、Vue Routerのナビゲーションガードを使用して、認証されたユーザーのみが特定のルートにアクセスできるようにする基本的なアイデアを示します。
import { createRouter, createWebHistory } from 'vue-router';
import Home from '../views/Home.vue';
import Post from '../views/Post.vue';
import Login from '../views/Login.vue';
import { isAuthenticated } from '../auth'; // 認証状態をチェックする関数
const routes = [
{ path: '/', component: Home },
{ path: '/post/:id', component: Post, meta: { requiresAuth: true } },
{ path: '/login', component: Login }
];
const router = createRouter({
history: createWebHistory(),
routes
});
router.beforeEach((to, from, next) => {
if (to.meta.requiresAuth && !isAuthenticated()) {
next('/login');
} else {
next();
}
});
export default router;
この教材では、Vue 3の<script setup>
構文を使用して、ブログアプリケーションの基本的な部分を構築する方法を概説しました。実際のアプリケーション開発では、APIからのデータ取得、認証サービスとの統合、そしてより複雑な状態管理が必要になるかもしれませんが、これらの基本を理解することで、より高度な機能に進むための土台が築けます。