vite基础学习笔记:8.本地存储(以用户信息为例)

说明:自学做的笔记和记录,如有错误请指正

知识点:前端本地存储方案之localStorage

保存数据

localStorage.setItem("key", "value");

读取数据

localStorage.getItem("key");

删除数据

    localStorage.removeItem("key");
    storage.clear();//清除所有数据

首先在使用 localStorage 的时候,我们需要判断浏览器是否支持 localStorage 这个属性:

    if(! window.localStorage){
        alert("浏览器不支持localstorage");
        return false;
    }else{
        //主逻辑业务
    }

localStorage存入json的相关用法:
①将json数据转化为json字符串之后再存入localStorage:

    var d=JSON.stringify(jsondata);
    storage.setItem("data",d);

②将存入的json字符串取出来,并转换成json对象:

    var json=storage.getItem("data");
    var jsonObj=JSON.parse(json);

1. 将接口返回数据存储到本地

①确认接口返回数据格式:如下图
在这里插入图片描述②将返回数据name及token保存至本地
在这里插入图片描述全部代码如下

const Login = async () => {
    await form.value.validate();
    try {
        const result = await reqLogin(loginParam);
        if (result.code == 200) {
            //如果接口调用成功,将返回的token保存
            window.localStorage.setItem("token", result.data.token);
        }
        // 跳转到另一页面
        $router.push({ path: '/one' });
    } catch (error) {
        ElMessage({
            type: "error",
            message: (error as Error).message
        })
    }
};

以上代码运行结果为:
登录成功后,本地存储中保存了name和token
在这里插入图片描述

2. 读取本地数据(将本地数据存储到数据仓库)

①将接口返回的值传给数据仓库
在这里插入图片描述代码如下:

const Login = async () => {
    await form.value.validate();
    try {
        const result = await reqLogin(loginParam);
        if (result.code) {
            //如果接口调用成功,将返回的token值存至本地存储
            window.localStorage.setItem("token",result.data.token);
            //调用useUserStore仓库中的setToken函数,将返回的token值传给数据仓库
            userStore.setToken(result.data.token)
        }
        // 跳转到另一页面result.data.token
        $router.push({ path: '/one' });
    } catch (error) {
        ElMessage({
            type: "error",
            message: (error as Error).message
        })
    }
};
//定义相关用户的仓库
import { defineStore } from "pinia";
const useUserStore = defineStore('user', {
    //数据,注意 state 是一个函数, 函数的返回值才是真正定义的数据
    state: () => {
        return {
            token:''
        }
    },
    //修改状态的方法
    actions: {
        setToken(token){
            this.token = token;
        }
    },
    //计算属性
    getters: {

    }
});
//获取仓库方法对外暴露
export default useUserStore;

以上代码运行结果为:
登录成功后,本地存储中保存了name和token且数据仓库存储了token数据
在这里插入图片描述②将本地数据赋值到数据仓库
在这里插入图片描述
store中的user.ts代码如下:

//定义相关用户的仓库
import { defineStore } from "pinia";
const useUserStore = defineStore('user', {
    //数据,注意 state 是一个函数, 函数的返回值才是真正定义的数据
    state: () => {
        return {
            token:window.localStorage.getItem('token')||{}
        }
    },
    //修改状态的方法
    actions: {
        setToken(token){
            this.token = token;
        }
    },
    //计算属性
    getters: {
        
    }
});
//获取仓库方法对外暴露
export default useUserStore;

以上代码实现效果为:
刷新界面,数据仓库中的token值不会丢失
在这里插入图片描述

3. 本地存储判断是否要记住账号

①设置saveUser存储是否记住账号,默认设置未false
在这里插入图片描述②将saveUser的值(即是否记住账号)存储到本地(key为isSave)
注意:本地存储布尔值(此处解决方案是将true存储为1,将false存储为0)
在这里插入图片描述

if (state.saveUser) {
window.localStorage.setItem("isSave", "1");
} else {
 window.localStorage.setItem("isSave", "0");
};

③判断本地的isSave值
若为1,说明上一次登录勾选了记住账号,恢复本地存储的登录信息,不需重新填写账号及密码;
若为0,说明上一次登录未勾选记住账号,清除本地存储的登录信息,需重新账号及密码。
在这里插入图片描述

代码如下:

<template>
    <div class="login">
        <p class="title">登录界面</p>
        <div class="top">
            <el-form :model="state.loginParam" :rules="rules" ref="form">
                <el-form-item label="账号" prop="phone">
                    <el-input placeholder="请输入11位手机号" v-model="state.loginParam.phone"></el-input>
                </el-form-item>
                <el-form-item label="密码" prop="code">
                    <el-input placeholder="请输入6位密码" v-model="state.loginParam.code"></el-input>
                </el-form-item>
                <el-form-item>
                    <el-checkbox label="记住账号" v-model="state.saveUser"></el-checkbox>
                </el-form-item>
            </el-form>
        </div>
        <div class="bottom">
            <el-button type="primary" @click="Login">登录</el-button>
        </div>
    </div>
</template>
<script setup lang="ts">
import { reactive, ref } from "vue";
import { ElMessage } from "element-plus";
import { useRouter } from "vue-router";
import { reqLogin } from "../../api/index";
import useUserStore from "../../store/modules/user";
let userStore = useUserStore();

let $router = useRouter();
const state = reactive({
    loginParam: {
        phone: '',
        code: '',
    },
    saveUser: false
});
if (JSON.parse(window.localStorage.getItem("isSave")) == 1) {
    state.loginParam.phone = JSON.parse(window.localStorage.getItem("phone"));
    state.loginParam.code = JSON.parse(window.localStorage.getItem("code"));
    state.saveUser=true
}else{
    localStorage.removeItem("phone");
    localStorage.removeItem("code");
}
const Login = async () => {
    await form.value.validate();
    try {
        const result = await reqLogin(state.loginParam);
        if ((result.code = 200)) {
            //如果接口调用成功,将返回的token值存至本地存储
            window.localStorage.setItem("token", result.data.token);
            window.localStorage.setItem("phone", state.loginParam.phone);
            window.localStorage.setItem("code", state.loginParam.code);
            //调用useUserStore仓库中的setToken函数,将返回的token值传给数据仓库
            userStore.setToken(result.data.token);
            if (state.saveUser) {
                window.localStorage.setItem("isSave", "1");
            } else {
                window.localStorage.setItem("isSave", "0");
            };
        }
        // 跳转到另一页面result.data.token
        $router.push({ path: "/one" });
    } catch (error) {
        ElMessage({
            type: "error",
            message: (error as Error).message,
        });
    }
};
// 自定义校验规则:手机号码自定义校验规则
const validatorPhone = (rule: any, value: any, callBack: any) => {
    // rule 表单校验的规则对象  value:当前文本的内容  callback:回调函数
    const reg =
        /^1((34[0-8])|(8\d{2})|(([35][0-35-9]|4[579]|66|7[35678]|9[1389])\d{1}))\d{7}$/;
    if (reg.test(value)) {
        callBack();
    } else {
        callBack(new Error("请输入正确的手机号格式"));
    }
};
// 自定义校验规则:验证码自定义校验规则
const validatorCode = (rule: any, value: any, callBack: any) => {
    // rule 表单校验的规则对象  value:当前文本的内容  callback:回调函数
    if (/^\d{6}$/.test(value)) {
        callBack();
    } else {
        callBack(new Error("请输入正确的验证码格式"));
    }
};
// 获取form组件实例
let form = ref<any>();
const rules = {
    phone: [{ trigger: "change", validator: validatorPhone }],
    code: [{ trigger: "change", validator: validatorCode }],
};
</script>

显示结果如下:
①勾选记住账号,刷新浏览器,账号及密码输入框的数据不清空
在这里插入图片描述在这里插入图片描述②未勾选记住账号:
在这里插入图片描述在这里插入图片描述刷新浏览器,账号及密码输入框的数据清空,本地登录数据清空
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值