当前位置: 首页 > news >正文

【VUE】状态管理:Pinia组件、Cookie组件

1.示例:使用Pinia管理用户状态信息,在各个组件中进行使用

index.js

import { createRouter, createWebHistory } from 'vue-router'
import {userInfoStore} from "@/stores/user.js";const router = createRouter({history: createWebHistory(import.meta.env.BASE_URL),routes: [{path: '/login',name: 'login',component: () => import('../views/LoginView.vue')},{path: '/admin',name: 'admin',component: () => import('../views/AdminView.vue'),children: [{path: "",redirect: {name: "mine"}},{path: "mine",name: "mine",component: () => import('../views/MineView.vue')},{path: "order",name: "order",component: () => import('../views/OrderView.vue')}]}]
})
router.beforeEach(function (to,from,next) {// 1.访问登录页面,不需要登录就可以直接去查看if (to.name === "login") {next()return}// 2.检查用户登录状态,登录成功,继续往后走next();未登录,跳转至登录页面// let username = localStorage.getItem("name")const store = userInfoStore()if (!store.userId){next({name:"login"})return;}// 3.登录成功且获取到用户信息,继续向后访问next()
})
export default router

store/user.js

import {ref, computed} from 'vue'
import {defineStore} from 'pinia'export const userInfoStore = defineStore('userInfo', () => {const userString = ref(localStorage.getItem("info"))const userDict = computed(() => userString.value ? JSON.parse(userString.value) : null)const userId = computed(() => userDict.value ? userDict.value.id : null)const userName = computed(() => userDict.value ? userDict.value.name : null)const userToken = computed(() => userString.value ? userDict.value.token : null)function doLogin(info) {localStorage.setItem("info", JSON.stringify(info))userString.value = JSON.stringify(info)}function doLogout(){localStorage.clear()userString.value = null}return {userId, userName, userToken, doLogin, doLogout}
})

App.vue

<script setup></script><template><RouterView />
</template><style scoped>
</style>

LoginView.vue

<template><div class="box"><p>用户名:<input type="text" placeholder="用户名" v-model="msg.username"></p><p>密码:<input type="text" placeholder="密码" v-model="msg.password"></p><p><button @click="doLogin">登录</button></p></div>
</template><script setup>
import {ref} from "vue";
import {useRouter} from "vue-router";
import {userInfoStore} from "@/stores/user.js";const msg = ref({username: "",password: ""
})
const router = useRouter()
const store = userInfoStore()const doLogin = function () {// 1、获取数据console.log(msg.value)// 2、发送网络请求// 3、本地存储用户信息(登录凭证)// localStorage.setItem("name", msg.value.username)let info = {id:1, name: msg.value.username, token: "ddsafhsjdfkj"}store.doLogin(info)// 3、跳转到首页router.push({name:"mine"})
}</script><style scoped>
.box {width: 300px;margin: 100px auto;
}
</style>

AdminView.vue

<template><div class="page-header"><div class="container"><RouterLink to="/admin/mine">我的</RouterLink>|<RouterLink to="/admin/order">订单</RouterLink><div style="float:right;"><a>{{store.userName}}</a><a @click="doLogout">退出1</a></div></div></div><div class="container"><RouterView/></div>
</template><script setup>
import {useRouter} from "vue-router";
import {userInfoStore} from "@/stores/user.js";const router = useRouter()
const store = userInfoStore()function doLogout() {store.doLogout()router.push({name: "login"})
}
</script><style scoped>
body {margin: 0;
}.page-header {height: 48px;background-color: cornflowerblue;line-height: 48px;
}.page-header a {display: inline-block;padding: 0 10px;cursor: pointer;
}.container {width: 980px;margin: 0 auto;
}</style>

JS中,const let var的用法区别是什么?

  • var:
    • 变量提升(即:先引用后声明)
    • 可多次声明,后一次会覆盖前一次
    • 函数内部声明,则为局部变量
    • 函数外部声明,则为全局变量
  • let:
    • 未声明前不可使用
    • 相同作用域内仅可声明一次
  • const:
    • 初始化的时候必须赋值
    • 常量:声明后的的值不可更改
    • 变量:声明后的指向的内存地址不能更改,但内存地址中的数据可以更改

https://blog.csdn.net/xiewenhui111/article/details/113133330


2. cookie组件

  • sudo npm i vue3-cookies
  • main.js
    • import VueCookies from “vue3-cookies”;
    • app.use(VueCookies);
  • 其他地方
    • import {useCookies} from “vue3-cookies”;
    • const {cookies} = useCookies()
    • cookies.set(key, value, 有效期)
    • cookies.get(key)
    • cookies.remove(key)

stores/user.js

import {ref, computed} from 'vue'
import {defineStore} from 'pinia'
import {useCookies} from "vue3-cookies";const {cookies} = useCookies()export const userInfoStore = defineStore('userInfo', () => {// const userString = ref(localStorage.getItem("info"))// const userDict = computed(() => userString.value ? JSON.parse(userString.value) : null)const userDict = ref(cookies.get("info"))const userId = computed(() => userDict.value ? userDict.value.id : null)const userName = computed(() => userDict.value ? userDict.value.name : null)const userToken = computed(() => userDict.value ? userDict.value.token : null)function doLogin(info) {// localStorage.setItem("info", JSON.stringify(info))// userString.value = JSON.stringify(info)cookies.set("info", JSON.stringify(info), 10)userDict.value = info}function doLogout() {// localStorage.clear()// userString.value = nullcookies.remove("info")userDict.value = null}return {userId, userName, userToken, doLogin, doLogout}
})

JSON.stringify:将一个 JavaScript 对象或值转换为 JSON 字符串
JSON 通常用于与服务端交换数据。在向服务器发送数据时一般是字符串,可以使用 JSON.stringify() 方法将 JavaScript 对象转换为字符串。

JSON.stringify({ x: 1, y: 2 });
// "{"x":1,"y":2}"
JSON.stringify({ x: [10, undefined, function(){}, Symbol('')] })
// "{"x":[10,null,null,null]}"

JSON.parse:将字符串转换为 JavaScript 对象
JSON 通常用于与服务端交换数据。在接收服务器数据时一般是字符串,可以使用 JSON.parse() 方法将数据转换为 JavaScript 对象。

const json = '{"result":true, "count":2}';
const obj = JSON.parse(json);
console.log(obj.count);
// 2
console.log(obj.result);
// true

JSON: JavaScript Object Notation(JavaScript 对象表示法)
JSON教程:https://www.runoob.com/json/json-syntax.html

JSON对象

{ "name":"runoob", "alexa":10000, "site":null }
  • JSON 对象使用在大括号 {…} 中书写。
  • 对象可以包含多个 key/value(键/值)对。
  • key 必须是字符串,value 可以是合法的 JSON 数据类型(字符串, 数字, 对象, 数组, 布尔值或 null)。
  • key 和 value 中使用冒号 : 分割。
  • 每个 key/value 对使用逗号 , 分割。

JSON数组

[ "Google", "Runoob", "Taobao" ]
  • JSON 数组在中括号中书写。
  • 中括号 [] 保存的数组是值(value)的有序集合。一个数组以左中括号 [ 开始, 右中括号 ] 结束,值之间使用逗号 , 分隔。
  • JSON 中数组值必须是合法的 JSON 数据类型(字符串, 数字, 对象, 数组, 布尔值或 null)。
  • JavaScript 中,数组值可以是以上的 JSON 数据类型,也可以是 JavaScript 的表达式,包括函数,日期,及 undefined。

相关文章:

  • 传奇微端黑屏不更新地图?传奇微端架设教程——GOM引擎
  • 【Linux】fork入门级使用
  • MySQL --基本查询(下)
  • TypeScript 设计模式之【观察者模式】
  • 照片压缩方法分享,掌握这些小技巧轻松压缩
  • Python中的数据处理与分析:从基础到高级
  • django开发流程1
  • 图像生成大模型 Imagen:AI创作新纪元
  • 9_23_QT窗口
  • 【C/C++】【基础数论】33、算数基本定理
  • 选择租用徐州存储服务器有什么作用?
  • 数据库系列(1)常见的四种非关系型数据库(NoSQL)
  • 前端Vue学习笔记02
  • go的结构体、方法、接口
  • 【1分钟学会】实用的Git工作流程
  • Asm.js的简单介绍
  • Docker 笔记(2):Dockerfile
  • HTTP--网络协议分层,http历史(二)
  • JDK9: 集成 Jshell 和 Maven 项目.
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • Meteor的表单提交:Form
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • Python实现BT种子转化为磁力链接【实战】
  • Rancher-k8s加速安装文档
  • spring-boot List转Page
  • Vue2 SSR 的优化之旅
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 温故知新之javascript面向对象
  • 用jquery写贪吃蛇
  • 用jQuery怎么做到前后端分离
  • 正则表达式
  • MyCAT水平分库
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • #{}和${}的区别是什么 -- java面试
  • (2024.6.23)最新版MAVEN的安装和配置教程(超详细)
  • (4)事件处理——(7)简单事件(Simple events)
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (Java入门)学生管理系统
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (备忘)Java Map 遍历
  • (待修改)PyG安装步骤
  • (含笔试题)深度解析数据在内存中的存储
  • (几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (十六)串口UART
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • .htaccess配置常用技巧
  • .NET COER+CONSUL微服务项目在CENTOS环境下的部署实践
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)