Vue 3での実装例

Element UIの日本語化

Vueプロジェクトのmain.tsに以下のコードを追加します。


import jaLocale from 'element-plus/es/locale/lang/ja'
app.use(ElementPlus, {
    locale: jaLocale,
})

Axiosの統一インターフェース作成

1. utilsディレクトリ内にrequest.tsを作成します。


import axios from "axios";
import { ElNotification } from "element-plus";
import { useAuthStore } from "@/stores/auth";
import router from "@/router";

const apiBase = "/api"; // 実際の環境に応じて設定
const client = axios.create({ baseURL: apiBase });

// レスポンスインターセプター
client.interceptors.response.use(
    (res) => {
        if (res.data.status === "success") {
            return res.data;
        } else {
            ElNotification.error(res.data.message || "サーバーでエラーが発生しました");
            return Promise.reject(res.data);
        }
    },
    (err) => {
        if (err.response?.status === 401) {
            ElNotification.warning("ログインが必要です");
            router.push("/login");
        } else {
            ElNotification.error("サーバーとの通信に失敗しました");
        }
        return Promise.reject(err);
    }
);

// リクエストインターセプター
client.interceptors.request.use(
    (config) => {
        const auth = useAuthStore();
        if (auth.credentials) {
            config.headers.Authorization = `Bearer ${auth.credentials}`;
        }
        return config;
    },
    (error) => Promise.reject(error)
);

export default client;

2. 以下のように開発用クロスドメイン対応を行います。


server: {
    proxy: {
        "/api": {
            target: "http://localhost:8080",
            changeOrigin: true,
            rewrite: (path) => path.replace(/^\/api/, ""),
        },
    },
}

Axiosの使用例

1. API関数をまとめたファイルuser.tsを作ります。


import request from "@/utils/request";

export const fetchUserData = () => request.get("/user/profile");

export const authenticateUser = (username: string, password: string) => {
    const formData = new URLSearchParams();
    formData.append("username", username);
    formData.append("password", password);
    return request.post("/user/authenticate", formData);
};

2. コンポーネント内で呼び出す場合:


async function retrieveToken() {
    const userData = await fetchUserData();
    console.log(userData.info);
}

グローバルナビゲーションガード

1. permission.tsで未認証時のリダイレクトを設定します。


import router from "@/router/index";
import { useAuthStore } from "@/stores/auth";

const publicRoutes = ["/login"];

router.beforeEach((to, from, next) => {
    const auth = useAuthStore();
    if (auth.isAuthenticated || publicRoutes.includes(to.path)) {
        next();
    } else {
        next("/login");
    }
});

Piniaの永続化

1. プラグインをインストールします。


npm install pinia-plugin-persistedstate

2. main.tsでプラグインを適用します。


import { createPersistPlugin } from "pinia-plugin-persistedstate";
const storage = createPersistPlugin();
const pinia = createPinia();
pinia.use(storage);
app.use(pinia);

3. ストア定義時に永続化を有効化します。


export const useAuthStore = defineStore("auth", () => {
    const credentials = ref("");
    return { credentials };
}, {
    persist: true,
});

Vue Routerの設定

1. ルート定義を行う。


import { createRouter, createWebHistory } from "vue-router";

const routes = [
    { path: "/login", name: "login", component: () => import("../views/Login.vue") },
    {
        path: "/dashboard",
        name: "dashboard",
        component: () => import("../views/Dashboard.vue"),
        children: [
            { path: "profile", component: () => import("../views/Profile.vue") },
            { path: "settings", component: () => import("../views/Settings.vue") },
        ],
    },
    { path: "/", redirect: "/login" },
];

const router = createRouter({
    history: createWebHistory(),
    routes,
});

export default router;

2. メニューでの遷移例:



    
        <User />
        <span>プロフィール</span>
    
    
        <Setting />
        <span>設定</span>
    

行データの操作

テーブル列で行データを使用する場合:



    
        <Edit />
    
    
        <Delete />
    

タグ: Vue3 Axios Pinia

7月4日 18:43 投稿