Pinia 状态管理器 菠萝:Option Store风格

Pinia介绍:

Pinia 是 Vue 的专属状态管理库,它允许你跨组件或页面共享状态。

Pinia 大小只有 1kb 左右,超轻量级,你甚至可能忘记它的存在!

相比 Vuex,Pinia 的优点:

  • 更贴合 Vue 3 的 Composition API 风格,学习成本更低
  • 不需要像Vuex中要区分 Mutation 和 Action,Pinia统一使用 Actions 操作状态
  • 支持 TypeScript,可以充分利用 TS 的静态类型系统
  • 模块化管理 States, 每个模块是一个 Store
  • 直观的 Devtools,可以看到每个 State 的变化

安装:

npm install pinia

# 或者

yarn add pinia

案列:

/src/router/index.js 路由器

import { createRouter, createWebHashHistory,createWebHistory } from "vue-router"; //导入vue-router路由模块,createWebHashHistor函数
//import Home from "../views/Home.vue" //异步加载的组件,这里不需要
//import List from "../views/List.vue" //异步加载的组件,这里不需要进行导入,所以要注释掉const routes = [{path: "/",  //路径:        redirect: {name: "ListA" //重定向到路由名称为mylist的路由中,这样当浏览器输入的是:http://localhost:5173/ 则会重定向跳转到 http://localhost:5173/list}},{path: "/lista",  //路径//当路由被触发时,该组件才会被异步加载,举列:打开页面就不会加载所有的组件,而是根据当前页面需要的组件进行异步加载//这样可以减少初始加载时间,提升用户体验,同时也节省了不必要的资源消耗。name:"ListA",component: () => import("../views/ListA.vue")},{path: "/listb",  //路径//当路由被触发时,该组件才会被异步加载,举列:打开页面就不会加载所有的组件,而是根据当前页面需要的组件进行异步加载//这样可以减少初始加载时间,提升用户体验,同时也节省了不必要的资源消耗。name:"ListB",component: () => import("../views/ListB.vue")}  
]//创建路由对象
const router = createRouter({//history:createWebHashHistory()   这种方式是按照hash路由模式来路由导航,这种路由模式的url地址会存在 /#/ 样式是:http://localhost:5173/#/listhistory: createWebHistory(),     //这种方式基于浏览器 history API 的路由模式,url的样式是:http://localhost:5173/listroutes, //routes:routes的缩写})export default router //导出router路由对象//导出router路由对象

Pinia状态管理器:模块

/src/store/useListAStore.js  ListA.vue组件单独使用的状态管理器模块

/*js文件的命名建议:use+组件名称+Store  举列:用于ListA组件的store 我的取名就是 useListAStore.js
*/import { defineStore } from 'pinia'
import axios from 'axios'// Option Store风格案列演示:如下//第一个参数是唯一的storeId
//第二个参数是一个对象
const useListAStore = defineStore("ListAStoreId", {// 为了完整类型推理,推荐使用箭头函数state: () => {return {// 所有这些属性都将自动推断出它们的类型name: 'Eduardo',age: 20,email: 'abc@qq.com',datalist: [],}},actions: {getDataList() {const result = async axios({url: "https://m.maizuo.com/gateway?cityId=110100&pageNum=1&pageSize=10&type=1&k=7069698",headers: {'X-Client-Info': '{"a":"3000","ch":"1002","v":"5.2.1","e":"16992764191480200349024257"}','X-Host': 'mall.film-ticket.film.list'}})this.datalist = result.data.data.films},async changeName(newname) {this.name = newname;}},getters: {filterDataList(state) {return (keyword) => {return state.datalist.filter(item => item.name.includes(keyword));}}},
})export default useListAStore //导出

/src/store/useListBStore.js    ListB.vue组件单独使用的状态管理器模块

/*js文件的命名建议:use+组件名称+Store  举列:用于ListA组件的store 我的取名就是 useListAStore.js
*/import { defineStore } from 'pinia'
import axios from 'axios'// Option Store风格案列演示:如下//第一个参数是唯一的storeId,注意别与其它模块的storeId重名(其实这个storeId我们开发人员一般用不到)
//第二个参数是一个对象
const useListBStore = defineStore("ListBStoreId", {// 为了完整类型推理,推荐使用箭头函数state: () => {return {// 所有这些属性都将自动推断出它们的类型name: '张三',datalist: [],}},actions: {async getDataList() {//异步const result = await axios({url: "https://m.maizuo.com/gateway?cityId=110100&ticketFlag=1&k=3777796",headers: {'X-Client-Info': '{"a":"3000","ch":"1002","v":"5.2.1","e":"16992764191480200349024257","bc":"110100"}','X-Host': 'mall.film-ticket.cinema.list'}});this.datalist = result.data.data.cinemas},async changeName(newname) {this.name = newname;}},getters: {filterDataList(state) {return (type) => {               return state.datalist.filter(item => item.eTicketFlag == type)}}},
})export default useListBStore //导出

注册:路由器 和 状态管理器

import { createApp } from 'vue'
import './style.css'
import App from './App.vue'import router from "../src/router/index.js" //导入状态管理器js 
//import store from "../src/store/index.js" //导入状态管理器js import { createPinia} from 'pinia' //导入状态管理器js 
const pinia=createPinia();var app=createApp(App)
app.use(router);
app.use(pinia); //注册pinia状态管理器 菠萝//app.use(store)  //注册vuex插件:状态管理器app.mount("#app")

使用:

ListA.vue组件:电影列表

<template><div><div><!-- 从useListAStore.js模块下的state中取数:获取useListAStore.js模块下state中的name -->姓名: {{ store.name }}</div><input type="text" v-model.lazy="keyword" placeholder="搜索"><ul><!-- 从useListAStore.js模块下的Getters中取数:执行Getters中的filterDataList方法 --><li v-for="item in store.datalist" :key="item.filmId">{{ item.name }}</li></ul></div>
</template>
<script setup>
// VCA中不支持辅助函数,因为辅助函数中是用this.$store,而VCA中没有绑定this的
import { useStore } from 'vuex'
import { ref, onMounted, onBeforeUnmount } from 'vue'
import useListAStore from '../store/useListAStore.js'const store = useListAStore();store.changeName("王五");//$patch的用法:// store.name="张三";
// store.age=30;
// store.email="123@qq.com";
// 上面三条数据的修改,可以用store.$patch方法统一修改:如下:
// store.$patch({
//     name:"张三",
//     age:30,
//     email:"123@qq.ccom"
// })const keyword = ref("");
onMounted(() => {if (store.datalist.length === 0) {store.getDataList();  //执行useListAStore.js模块中Actions中的getDataList方法  }
})onBeforeUnmount(() => {store.$reset() //对useListAStore.js模块下store里面state中的所有数据进行重置:注意是重置
})</script>
<style scoped>
li {padding: 10px;
}
</style>

ListB.vue组件:影院列表

<template><div><!-- 从store中的state中取数:获取useListBStore.js模块state中的name --><div> 姓名:{{ store.name }}</div><select v-model="type"><option :value="0">APP订票</option><option :value="1">前台兑换</option></select><ul><!-- 从store中的Getters中取数:执行useListBStore.js模块Getters中的filterDataList方法 --><li v-for="item in store.filterDataList(type)" :key="item.cinemaId"> {{ item.name }}</li></ul></div>
</template>
<script setup>
// VCA中不支持辅助函数,因为辅助函数中是用this.$store,而VCA中没有绑定this的import { ref, onMounted } from 'vue'
import useListBStore from '../store/useListBStore.js' 
const store = useListBStore();const type = ref(0);
onMounted(() => {if (store.datalist.length === 0) {store.getDataList(); //执行useListBStore.js模块中Actions中的getDataList方法}
})
</script>

App.vue根组件

<template><div><div>{{store.name}}</div><ul class="nvabar"><RouterLink custom to="/ListA" v-slot="{ isActive, navigate }"><li @click="navigate"><span :class="isActive ? 'highlighter' : ''">电影列表</span></li></RouterLink><RouterLink custom to="/ListB" v-slot="{ isActive, navigate }"><li @click="navigate"><span :class="isActive ? 'highlighter' : ''">影院列表</span></li></RouterLink></ul><router-view></router-view></div>
</template>
<script setup>
import { ref, } from 'vue';import ListA from "./views/ListA.vue" //导入Home组件:
import ListB from "./views/ListB.vue" //导入List组件:import useListAStore from './store/useListAStore.js'const store=useListAStore();</script>
<style scoped>
.nvabar {/*固定定位:元素的位置相对于浏览器窗口是固定位置。即使窗口是滚动的它也不会移动*//* position: fixed; *//*显示在底部*//* bottom: 0; */display: flex;/* width: 100%; */height: 50px;line-height: 50px;text-align: center;
}.nvabar li {flex: 1;list-style-type: none;
}.highlighter {/* 高亮 */color: red;border-bottom: 3px solid red;padding-bottom: 7px;}
</style>

效果图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/139765.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

No185.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

STM32 寄存器配置笔记——GPIO配置输出

一、概述 本文主要介绍GPIO 作为输出时的寄存器配置。包括时钟配置&#xff0c;输出模式配置。以STM32F10xxx系列为例&#xff0c;配置PA8、PD2端口作为输出&#xff0c;输出高/低电平。 二、配置流程 1&#xff09;GPIO外设时钟 通过查找STM32F10xxx中文参考手册得知&#xf…

【Python大数据笔记_day07_hive中的分区表、分桶表以及一些特殊类型】

分区表 分区表的特点/好处:需要产生分区目录,查询的时候使用分区字段筛选数据,避免全表扫描从而提升查询效率 效率上注意:如果分区表在查询的时候呀没有使用分区字段去筛选数据,效率不变 分区字段名注意:分区字段名不能和原有的字段名重复,因为分区字段名要作为字段拼接到表后…

Postman常见报错与解决方法,持续更新~

postman中文文档 基本操作&#xff1a;从控制台查看请求报错 如果 Postman 无法发送你的请求&#xff0c;或者如果它没有收到你发送请求的 API 的响应&#xff0c;你将收到一条错误消息。此消息将包含问题概述和指向控制台的链接&#xff0c;你可以在其中访问有关请求的详细信…

单源最短路解决多源汇最短路问题,1127. 香甜的黄油

1127. 香甜的黄油 - AcWing题库 农夫John发现了做出全威斯康辛州最甜的黄油的方法&#xff1a;糖。 把糖放在一片牧场上&#xff0c;他知道 N 只奶牛会过来舔它&#xff0c;这样就能做出能卖好价钱的超甜黄油。 当然&#xff0c;他将付出额外的费用在奶牛上。 农夫John很狡…

HelloGitHub 社区动态,开启新的篇章!

今天这篇文章是 HelloGitHub 社区动态的第一篇文章&#xff0c;所以我想多说两句&#xff0c;聊聊为啥开启这个系列。 我是 2016 年创建的 HelloGitHub&#xff0c;它从最初的一份分享开源项目的月刊&#xff0c;现如今已经成长为 7w Star 的开源项目、1w 用户的开源社区、全网…

tomcat web.xml文件中servlet的load-on-startup

先看一个例子&#xff1a; <servlet><description>JAX-WS endpoint - restful</description><display-name>restful</display-name><servlet-name>restful-addnumbers</servlet-name><servlet-class>com.sun.xml.ws.transpor…

lightdb支持cast(expr as unsigned)-mysql兼容

LightDB 从23.4开始支持mysql 的cast(expr as unsigned) 语法&#xff0c;下面说明下不兼容的注意点及示例 注意点 LightDB 还没有实际的unsigned bigint 类型返回类型与mysql不同&#xff0c;LightDB 为 numeric&#xff0c; mysql 为 unsigned bigint.表达式不能为日期/时间…

Console LDAP 配置解密

之前通过短视频向大家介绍了 Console 如何集成 LDAP&#xff0c;但很多小伙伴反映按照视频里的配置后不成功。今天就结合小伙伴们反映的问题来跟大家详细介绍一下。 Console LDAP 完整的配置参数如下&#xff1a; 名称类型说明hoststringLDAP 服务器地址portintLDAP 服务器端口…

Spring Cloud和Kubernetes + Spring Boot 用哪个?

Spring Cloud和Kubernetes Spring Boot都是用于构建微服务架构的解决方案&#xff0c;它们各有优势和不足&#xff0c;选择哪个更好取决于你的具体需求和上下文。 Spring Cloud是一个基于Spring Boot的微服务开发框架&#xff0c;它提供了一套完整的微服务解决方案&#xff0…

Flink SQL自定义表值函数(Table Function)

使用场景&#xff1a; 表值函数即 UDTF&#xff0c;⽤于进⼀条数据&#xff0c;出多条数据的场景。 开发流程&#xff1a; 实现 org.apache.flink.table.functions.TableFunction 接⼝实现⼀个或者多个⾃定义的 eval 函数&#xff0c;名称必须叫做 eval&#xff0c;eval ⽅法…

TCP发送窗口、接收窗口以及其工作原理

1*KvfIrP_Iwq40uVdRZYGnQg.png 上面的图表是从发送方的角度拍摄的快照。我们可以将数据分为4组&#xff1a; 1.已发送并已确认的字节&#xff08;蓝色&#xff09;2.已发送但尚未确认的字节&#xff08;黄色&#xff09;3.未发送但接收方准备好接收的字节&#xff08;绿色&…

2.如何实现API统一响应-web组件篇

文章目录 1. 统一响应1.1 CommonResult 1. 统一响应 前端调用api接口获得统一的响应&#xff1a; 成功&#xff0c;返回成功的状态码和数据&#xff1b;失败&#xff0c;返回失败的状态码和错误提示。 在标准的 RESTful API 的定义&#xff0c;是推荐使用 HTTP 响应状态码 (…

QT QSplashScreen

多数大型应用程序启动时都会在程序完全启动前显示一个启动画面&#xff0c;在程序完全启动后消失。程序启动画面可以显示相关产品的一些信息&#xff0c;使用户在等待程序启动的同时了解相关产品的功能&#xff0c;这也是一个宣传的方式。Qt中提供的QSplashScreen 类实现了在程…

KCC@广州与 TiDB 社区联手—广州开源盛宴

10月21日&#xff0c;KCC广州与 TiDB 社区联手&#xff0c;在海珠区保利中悦广场 29 楼召开了一次难忘的开源盛宴。这不仅仅是 KCC广州的又一次线下见面&#xff0c;更代表着与 TiDB 社区及广州技术社区的首次深度合作。 活动的策划与组织由 KCC广州负责人 - 惠世冀、PingCAP 的…

归并排序 图解 递归 + 非递归 + 笔记

前置知识&#xff1a;讲解019-算法笔试中处理输入和输出&#xff0c;讲解020-递归和master公式 (1)左部分排好序&#xff0c;右部分排好序&#xff0c;利用merge过程让左右整体有序(2)merge过程:谁小拷贝谁&#xff0c;直到左右两部分所有的数字耗尽(3)递归实现和非递归实现(4…

浙大恩特客户资源管理系统 fileupload.jsp 任意文件上传

一、漏洞描述 杭州恩软信息技术有限公司&#xff08;浙大恩特&#xff09;提供外贸管理软件、外贸客户管理软件等外贸软件&#xff0c;是一家专注于外贸客户资源管理及订单管理产品及服务的综合性公司。 浙大恩特客户资源管理系统中的fileupload.jsp接口存在安全漏洞&#xf…

DDD贫血模型、充血模型

贫血模型 贫血模型是一种软件开发中的设计模式&#xff0c;它指的是将数据和业务逻辑分离的一种设计模式&#xff0c;其中数据和领域模型是独立于业务逻辑的。在贫血模型中&#xff0c;数据由数据对象存储&#xff0c;而业务逻辑由服务对象处理。这种设计模式的优点是使代码更…

Android修行手册 - 万字梳理JNI开发正确技巧和错误缺陷

JNI 简介 JNI&#xff0c;Java Native Interface&#xff0c;是 native code 的编程接口。JNI 使 Java 代码程序可以与 native code 交互——在 Java 程序中调用 native code&#xff1b;在 native code 中嵌入 Java 虚拟机调用 Java 的代码。 它支持将 Java 代码与使用其他…