這邊分享歡迎訊息顯示會員名用儲存在瀏覽器的 localStorage 方法。
(1)介紹 localStorage
HTML 5 出現後瀏覽器暫存有了 Local Storage 這個存放於本地端的儲存空間。存放在裡面的資料會一直存在,直到資料被清除才會消失。該儲存方式不建議存放隱私性的用戶等資料。尋找解決 Pinia store 錯誤訊息時發現 Local Storage ,試著將之應用到專案。分享給各位讀者。
使用 Local Storage 前先了解其以下缺點。內容參考五倍紅寶石・五倍學院。
(1.1) localStorage 基本用法
介紹幾個 localStorage 的基本用法與說明。
localStorage.getItem(key);
localStorage.setItem(key, value);
localStorage.removeItem(key);  
localStorage.clear();
應用上可以參考五倍紅寶石・五倍學院這篇文章,在一個簡易的登入畫面有做示範。
(2)會員登入頁面調用 localStorage
第4種寫法不用建立 Pinia store 所以不用新增前面兩篇的 LoginStore.js 檔案。
路徑 src / views / front / LoginView.vue 的 <script></script> ,表單通過驗證的這段語法, axios.get() 取得資料集後,可透過 localStorage.setItem("user-info",JSON.stringify(res.data)) 在 localStorage 建立屬性 user-info ,並將 axios.get() 的用戶資料(json 格式)用 JSON.stringify 轉換成 JavaScript 可讀取的型態來儲存值。語法如下。
<script>
...
export default {
    ...
  methods: {
    ...
    // 表單送出按鈕
    submitOrder() {
      // 使用 Vee Validate 的 validate 函式來驗證表單
      this.$refs.form.validate().then((valid) => {
        if (valid) {
          // 驗證通過,可以提交表單
          axios
            .get(
              `http://localhost:3000/user?email=${this.email}&password=${this.password}`
            )
            .then((res) => {
              ...
              // 法4(不用pinia store)
              localStorage.setItem("user-info",JSON.stringify(res.data))
              ...
            })
            .catch((error) => {
              ...
            });
        } else {
          ...
        }
      });
    },
  },
};
</script>
因為 json 格式只能儲存字串型態資料,需透過 JavaScript 處理 JSON 的兩個語法 JSON.parse 、 JSON.stringify 將資料轉換為陣列或字串後才能用。
附上 localStorage 存放的資料(從瀏覽器 chrome 滑鼠右鍵開發者工具,選擇列表上 application 頁籤後照著下面圖示點選 localStorage )。
(3)會員主頁顯示會員名
路徑 src / components / MainView.vue 。
在 <script></script> 開頭不用引用 Pinia 和 store 。即不用寫以下語法。
import { mapState } from 'pinia';
import { useLoginStore } from "../../components/LoginStore.js";
或
import useLoginStore from "../../components/LoginStore.js";
調用 localStorage 寫法:
STEP1:data 中建立 userInfo 屬性(作為會員名)並預設其初始值 null 。
STEP2:會員主頁載入前先執行 created 內的語法。定義變數 userInfoString 來承接暫存在 localStorage 的 user-info 。更新 data 的 userInfo 屬性前先判斷 localStorage 裡是否有屬性 user-info 。
<script>
export default {
  // 法4(不用pinia store)
  data() {
    return {
      userInfo: null, // 先初始化定義為 null
      userInfoName: null, // 先初始化定義為 null
    };
  },
    
  // created 是初始化執行(html模板渲染之前)
  created() {
    const userInfoString = localStorage.getItem("user-info");
    // 檢查 user-info 是否存在,存在才執行
    if (userInfoString) {
      this.userInfo = JSON.parse(userInfoString);
      this.userInfoName=(this.userInfo[0]?.name);
      // 印出來看看
      // console.log(this.userInfoName);
    }
  },
  methods: {
    logout() {
      localStorage.clear();
    },
  },
};
</script>
STEP3:html 架構裡將登出選項增加 logout() 函式去清除整個 localStorage 本地端儲存的資料。再調整會員名 {{}} 的資料源。
<template>
  <div class="container">
    <ul class="nav main-nav mb-5">
      ...
      <li class="nav-item">
        <RouterLink to="/login" class="nav-link py-3 px-4" @click="logout"
          >登出</RouterLink>
      </li>
    </ul>
    <!-- 法4(不用pinia store) -->
    <p class="fs-4 fw-bold text-capitalize text-primary">
      歡迎華特會員 {{ userInfo && userInfoName }}
    </p>
    ...
  </div>
</template>