天天看點

Vue3項目實踐-第五篇(改造登入頁-Axios模拟請求資料)

作者:道藏心源鶴铧

本文将介紹以下内容:

  • 項目中的 public 目錄和通路靜态資源檔案的方法
  • 使用 json 檔案代替http模拟請求
  • 使用 Axios 直接通路 json 檔案
  • 改造登入頁,配合 Axios 進行登入請求,并添加錯誤提示

項目中的 public 目錄和通路靜态資源檔案的方法

項目中,public 目錄用于存放靜态資源檔案,這些檔案将直接複制到建構輸出目錄而不經過編譯處理。public 目錄下的檔案可以通過相對路徑直接通路。

以下是關于 public 目錄的一些說明和示例:

  • 建立 public 目錄:在你的項目根目錄下建立一個名為 public 的目錄(如果還不存在)。
  • 靜态資源檔案:将需要在項目中通路的靜态資源檔案放置在 public 目錄中。這些檔案可以是圖檔、字型、視訊、音頻、JSON 檔案等。
  • 通路靜态資源檔案:在你的代碼中,可以通過相對路徑直接通路 public 目錄下的檔案。例如,如果你有一個 public/images/logo.png 圖檔檔案,你可以在 Vue 元件中這樣使用
<template>
  <div>
    <img src="/images/logo.png" alt="Logo" />
  </div>
</template>           

上面的代碼中,我們使用了相對路徑 /images/logo.png 來引用 public 目錄下的圖檔檔案。

請注意,在使用相對路徑時不需要包含 public 目錄名。Vite 會自動将相對路徑解析為 public 目錄下對應的檔案。

通過将靜态資源檔案放置在 public 目錄中,它們将被直接複制到建構輸出目錄中,而無需經過編譯處理。這使得通路這些檔案變得非常簡單和高效。

使用 json 檔案代替http模拟請求

使用 JSON 檔案來模拟 HTTP 請求,可以将 JSON 檔案放在項目的 public 目錄中,并通過 http 方法直接在浏覽器中通路。

以下是一個示例:

  • 在項目的 public/data 目錄中建立一個 JSON 檔案,例如 page.json,并将需要的資料儲存在其中。
  • 在浏覽器中,直接使用http位址展示 JSON 檔案并使用其中的資料。
Vue3項目實踐-第五篇(改造登入頁-Axios模拟請求資料)
Vue3項目實踐-第五篇(改造登入頁-Axios模拟請求資料)

使用 Axios 直接通路 json 檔案

繼續上述内容,直接通過Axios 通路 json 檔案,使用 Axios 直接通路 JSON 檔案時,我們可可以按照以下步驟進行操作:

  • 確定已安裝 Axios,可以使用以下指令進行安裝:
npm install axios           
  • 在 Vue 元件中,導入 Axios 并使用它來發送 GET 請求來擷取 JSON 檔案的資料。
<template>
    <h1>Home Page</h1>
    <p>
        {{ pageData }}
    </p>
</template>
<script lang="ts" setup>

import { ref } from 'vue';
import axios from 'axios';

const pageData = ref({});

const load = async () => {
    console.log('執行請求');

    try {
        const {data} = await axios.get('./data/page.json');

        console.log(data);

        pageData.value = data;
      } catch (error) {
        console.error(error);
      }
}

load();

</script>           
Vue3項目實踐-第五篇(改造登入頁-Axios模拟請求資料)

在上述示例中,首先通過 import axios from 'axios' 導入 Axios 庫。然後,在元件的 pageData 中,在 load 方法中,我們使用 axios.get 發送一個 GET 請求來擷取指定路徑的 JSON 檔案資料,并将響應的資料類型解構為 data。一旦擷取到資料,我們将其指派給 pageData.value 。

請確定将 /data/page.json 能在浏覽器中被通路。

通過這種方式,項目中使用 Axios 直接通路 JSON 檔案,并且能夠獲得類型檢查的好處。記得在實際應用中,確定你的 JSON 檔案的路徑和檔案名是正确的,并且可在伺服器上正常通路。

改造登入頁,配合 Axios 進行登入請求,并添加錯誤提示

改造登入頁,結合 Axios 進行登入請求,并添加錯誤提示,先在public/data 檔案夾下建立個login.json檔案,友善校驗登入輸入資訊的校對。

[
    {
        "userName": "admin",
        "userPass": "12345"
    },
    {
        "userName": "test",
        "userPass": "123456"
    }
]           
  • 導入依賴元件(router、axios、element-plus):
import { useRouter } from 'vue-router';
import axios from 'axios';
import { ElMessage } from 'element-plus'           

router:校驗成功後,跳轉位址

axios:模拟請求http(通路json檔案)

ElMessage:提示資訊

  • 修改登入邏輯
const submitForm = async () => {
    formRef.value.validate((valid: any) => {
        if (valid) {
            // 表單校驗通過,可以進行送出操作
            console.log('表單校驗通過');
            console.log(formData.value); // 擷取表單資料
        } else {
            // 表單校驗失敗,可以進行錯誤處理
            console.log('表單校驗失敗');
            return false;
        }
    });

    await checkLoginValue();
};

const checkLoginValue = async () => {
    try {
        const { data } = await axios.get('./data/login.json');

        let success = false;

        for (const temp of data) {
            if (temp.userName === formData.value.username
                && temp.userPass === formData.value.password) {
                success = true;
                break;
            }
        }

        if (success) {
            router.push('/');
        } else {
            ElMessage({
                message: '使用者名或密碼錯誤,請檢查後,重新登入!',
                type: 'warning',
            });
        }

    } catch (error) {
        console.error(error);
    }
}           

完整示例:

<template>
    <div class="login-container">
        <el-form ref="formRef" :model="formData" :rules="formRules" class="login-form">
            <h2 class="login-title">登入</h2>
            <el-form-item prop="username">
                <el-input v-model="formData.username" placeholder="請輸入使用者名"></el-input>
            </el-form-item>
            <el-form-item prop="password">
                <el-input v-model="formData.password" type="password" placeholder="請輸入密碼"></el-input>
            </el-form-item>
            <el-form-item>
                <el-button type="primary" @click="submitForm">登入</el-button>
                <el-button type="primary" @click="resetForm">重置</el-button>
            </el-form-item>
        </el-form>
    </div>
</template>
<script lang="ts" setup>

import { useRouter } from 'vue-router';
import { ref } from 'vue';
import axios from 'axios';
import { ElMessage } from 'element-plus'

const formData = ref({
    username: '',
    password: '',
});

const formRules = ref({
    username: [
        { required: true, message: '請輸入使用者名', trigger: 'blur' },
    ],
    password: [
        { required: true, message: '請輸入密碼', trigger: 'blur' },
    ],
});

const formRef = ref();

const resetForm = () => {
    if (!formRef) return
    formRef.value.resetFields()
}

const router = useRouter();
const submitForm = async () => {

    console.log("formRef.value:", formRef.value);

    formRef.value.validate((valid: any) => {
        if (valid) {
            // 表單校驗通過,可以進行送出操作
            console.log('表單校驗通過');
            console.log(formData.value); // 擷取表單資料
        } else {
            // 表單校驗失敗,可以進行錯誤處理
            console.log('表單校驗失敗');
            return false;
        }
    });

    await checkLoginValue();

};

const checkLoginValue = async () => {
    try {
        const { data } = await axios.get('./data/login.json');

        let success = false;

        for (const temp of data) {
            if (temp.userName === formData.value.username
                && temp.userPass === formData.value.password) {
                success = true;
                break;
            }
        }

        if (success) {
            router.push('/');
        } else {
            ElMessage({
                message: '使用者名或密碼錯誤,請檢查後,重新登入!',
                type: 'warning',
            });
        }

    } catch (error) {
        console.error(error);
    }
}
</script>
<style scoped>
.login-container {
    width: 100%;
    height: 100vh;
    display: flex;
    justify-content: center;
    align-items: center;
}

.login-form {
    max-width: 400px;
    width: 100%;
}

.login-title {
    text-align: center;
    font-size: 24px;
    margin-bottom: 20px;
}
</style>           
Vue3項目實踐-第五篇(改造登入頁-Axios模拟請求資料)
Vue3項目實踐-第五篇(改造登入頁-Axios模拟請求資料)
Vue3項目實踐-第五篇(改造登入頁-Axios模拟請求資料)

繼續閱讀