pinia学习
1.安装
yarn add pinia
OR 使用npm
npm install pinia
pinia是Vue的存储库,允许跨组件/页面共享状态。
pinia和vuex的作用一样,充当一个存储数据的作用,存储在pinia的数据允许我们在各个组件中使用。
pinia优点:
1.pinina只有state,getter,action。
2.pinia中action支持同步和异步,vuex不支持【vue2中action是异步的去commit操作,而mutations是同步的】。
3.良好的Typescript支持
4.无需创建各个模块嵌套,pinia中每个store都是独立的,互相不影响。
5.体积非常小,只有1kb左右
6.pinia支持插件来扩展自身功能
7.支持服务端渲染
2.创建一个pinia实例(根store)并将其传递给应用
import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'
const pinia = createPinia();
const app = createApp(App);
app.use(pinia);
app.mount('#app');
3.Store
store 是一个保存状态和业务逻辑的实体。
有三个概念: state, getter, action。
4.创建一个store例子
// stores/count.js
store 是用 defineStore() 定义的,他的第一个参数要求是一个独一无二的名字:
import { defineStore } from 'pinia';
export const useCountStore = defineStore('main',{
// 其他配置...
state:()=>({
count: 0
}),
getters:{
double: (state)=>state.count * 2
},
actions: {
increment(){
this.count++;
}
}
})
使用方式:
//some.vue
<script setup>
import useCountStore from '@/stores/count'
import { computed } from 'vue'
import {storeToRefs} from 'pinia';//为了从store中提取属性时保持其响应式,需要引入 storeToRefs
const counter = useCountStore();
const { count } = storeToRefs(counter);
const { increment } = counter;
counter.count++;
counter.increment();
//OR
counter.$patch({ count: counter.count+1 })
const doubleCount = computed(()=> counter.count * 2);
</script>
5.重置state
调用 store的 $reset()方法将state重置为初始值。
例如:
const store = useStore();
store.$reset();
6.举例demo
项目搭建
执行命令:
npm create vite@latest my-vite-app --template vue-ts
运行项目:
npm install
npm run dev
安装pinia(见上文)
npm install pinia
修改main.js,引入pinia提供的createPinia方法,创建根存储。
//main.ts
import { createApp } from 'vue';
import App from './App.vue'
import { createPinia } from 'pinia';
const pinia = createPinia();
const app = createApp(App);
app.use(pinia);
app.mount('#app');
在src目录下新建store文件夹,用来存放创建的各种store,然后在该目录下新建 user.ts 文件,主要用来存放与user相关的store。
//例如:src/store/user.ts
import { defineStore } from 'pinia';
export const userStore = defineStore('user',{
state:()=>({
userInfo:{
name: 'sunnyeve',
age: 18
},
sayHello: 'hello world',
count: 0,
items: []
}),
getters:{ //相当于computed,作用是返回一个新的结果,会被缓存
getDoubleAge:(state)=>{
return state.age * 2;
},
getUserInfo():string{
return this.name + this.getDoubleAge
}
},
actions:{
changeName(name: string){
this.name = name;
}
}
})
//使用store, /src/views/home.vue
<template>
<div>sayhello: {{sayHello}}</div>
<div>{{userInfo.name}}</div>
<div>{{userInfo.age}}</div>
<button @click='changeAge'>点击更改age</button>
<button @click='reset'>重置store</button>
<button @click='patchStore'>批量更改数据</button>
</template>
<script setup lang="ts">
import { userStore } from '@/store/user';
import { storeToRefs } from 'pinia';
const useUserStore = userStore();
const { userInfo, count, sayHello } = storeToRefs(useUserStore);
const changeAge = ()=>{
useUserStore.age++;
}
const reset = ()=>{
useUserStore.$reset();//这个方法会将store中的数据变为初始状态,页面也会更新。
}
const patchStore=()=>{
useUserStore.$patch({
count: 10,
sayHello: 'hello world~~~'
})
}
//也可下面这种写法,原因在于假设state中有些字段无需更改,就可以用$patch方法接收一个回调函数方式解决
useUserStore.$patch((state)=>{
state.items.push({name:'xx', price: 100});
state.hasChanged = true
})
//直接替换整个store, 使用store的$state方法
useUserStore.$state = { name: 'xx', age: 18}
</script>
参考链接:
https://pinia.vuejs.org/zh/getting-started.html - 官方文档
https://zhuanlan.zhihu.com/p/533233367
pinia学习的更多相关文章
- 轻量级状态管理库Pinia试吃
最近连续看了几个GitHub上的开源项目,里面都用到了 Pinia 这个状态管理库,于是研究了一下,发现确实是个好东西!那么,Pinia 的特点: 轻量化 -- Pinia 体积约1KB,十分轻巧 ...
- 在Vue3项目中使用pinia代替Vuex进行数据存储
pinia是一个vue的状态存储库,你可以使用它来存储.共享一些跨组件或者页面的数据,使用起来和vuex非常类似.pina相对Vuex来说,更好的ts支持和代码自动补全功能.本篇随笔介绍pinia的基 ...
- vue下一代状态管理Pinia.js 保证你看的明明白白!
1.pinia的简单介绍 Pinia最初是在2019年11月左右重新设计使用Composition API的 Vue 商店外观的实验. 从那时起,最初的原则相同,但 Pinia 适用于 Vue 2 和 ...
- 结合 Vuex 和 Pinia 做一个适合自己的状态管理 nf-state
一开始学习了一下 Vuex,感觉比较冗余,就自己做了一个轻量级的状态管理. 后来又学习了 Pinia,于是参考 Pinia 改进了一下自己的状态管理. 结合 Vuex 和 Pinia, 保留需要的功能 ...
- Vben Admin 源码学习:项目初始化
0x00 前言 Vue-Vben-Admin 是一个免费开源的中后台模版.使用了最新的vue3,vite2,TypeScript等主流技术开发,开箱即用的中后台前端解决方案考. 本系列本着学习参考的目 ...
- pinia 入门及使用
自上月从上海结束工作回来 在家闲来无事 想写点东西打发时间 也顺便学习学习新的技术.偶然发现了 pinia 据说比vuex好用些 所以便搭了个demo尝试着用了下 感觉确实不错,于是便有了这篇随笔. ...
- Blazor和Vue对比学习(进阶2.2.3):状态管理之状态共享,Blazor的依赖注入和第三方库Fluxor
Blazor没有提供状态共享的方案,虽然依赖注入可以实现一个全局对象,这个对象可以拥有状态.计算属性.方法等特征,但并不具备响应式.比如,组件A和组件B,都注入了这个全局对象,并引用了全局对象上的数据 ...
- vue3中pinia的使用总结
pinia的简介和优势: Pinia是Vue生态里Vuex的代替者,一个全新Vue的状态管理库.在Vue3成为正式版以后,尤雨溪强势推荐的项目就是Pinia.那先来看看Pinia比Vuex好的地方,也 ...
- 从直播编程到直播教育:LiveEdu.tv开启多元化的在线学习直播时代
2015年9月,一个叫Livecoding.tv的网站在互联网上引起了编程界的注意.缘于Pingwest品玩的一位编辑在上网时无意中发现了这个网站,并写了一篇文章<一个比直播睡觉更奇怪的网站:直 ...
- Angular2学习笔记(1)
Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...
随机推荐
- 关于vux-ui框架的scroller组件所踩的坑
这是我在做一个demo的一个上垃加载下拉刷新功能时所遇到的问题,由于伤了好一会脑筋,所以留下这篇笔记以供后续查询: 在上代码前建议在开发项目时不要优先选择vux这个框架,因为有一些常用的功能组件官方已 ...
- python之路76 路飞项目 企业项目类型、软件开发流程、路飞项目需求、pip永久换源、虚拟环境、路飞项目前后端创建、包导入、后端项目目录调整
知识获取渠道 cnblogs csdn 掘金 思否 找工作app boss直骗.拉钩.智联.猎聘.脉脉(内推,hr). 企业项目类型 1.面向互联网用户:商城类项目 微信小程序商城 2.面向互联网用户 ...
- 2013-12-2 ISBN号码
问题描述 试题编号: 201312-2 试题名称: ISBN号码 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包 ...
- [EULAR文摘] 利用蛋白组学技术开发一项蛋白评分用于预测TNFi疗效
利用蛋白组学技术开发一项蛋白评分与临床参数联用可以增强对TNF拮抗剂对RA疗效的预测效能 Cuppen BV, et al. EULAR 2015. Present ID: OP0130. 背景: 对 ...
- 代码随想录算法训练营day04 | leetcode
基础知识 记录一下栈实现及操作 public class ArrayDequeStack { public void main() { ArrayDeque stack = new ArrayDequ ...
- 把MyBatis当项目一样,讲透源码的技术书籍!
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 为啥?因为这些年,就很少有人能自主意识到,如何提升编码质量! 但讲屁话没有用,想学好编程突破阶 ...
- .NET控制台程序秒变asp.net core站点
有个.NET控制台程序用来跑定时任务的,但是做好后需求发生变化,跑出的数据结果不能直接使用,数据需要转成json格式通过web接口来调用实现.这个控制台是个单体程序,没有封装,如果新建一个项目的话还得 ...
- containerd.service containerd-1.6.8-linux-amd64.tar.gz cni-plugins-linux-amd64-v1.1.1.tgz 标准文件下载
配置K8S时 可能会用到#systemcd来管理containerd,这https://raw.githubusercontent.com/containerd/containerd/main/con ...
- mysql的数据操作
INSERT [INTO] 表名 [(字段名1,...)] {VALUES | VALUE} ({expr | DEFAULT},...),(...),... 说明:主键列是自动增长,但是在全列插入时 ...
- oracle 2个数组列,剔除数组重复的数据。
一.下面这样不规则的,数据如何剔除掉.循环筛选replace替换掉. 序号 正常时间 剔除时间 1 2022-12-19,2022-12-20,2022-12-21,2022-12-22,202 ...