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

Vue3 pinia

1.简介

集中式状态(数据)管理

和vueX一样

2.安装pinia

npm i pinia
//引入 createApp用于创建应用
import {createApp} from 'vue';
//引入 App 根组件
import App from './App.vue';//引入pinia
import {createPinia} from 'pinia';//创建一个应用
const app = createApp(App);//创建pinia
const pinia = createPinia();
//安装pinia
app.use(pinia);//挂载整个应用到app容器中
app.mount('#app');

3.存储+读取数据

import {defineStore} from 'pinia';
//hooks命名
//1参数 是id值,最好跟文件名保持一致
export const useCountStore = defineStore('count',{//数据存储的地方state:()=>{return{sum:6}}
})
<template><div class="count"><h2>当前求和为: {{ countStore.sum }}</h2><select v-model.number="n"><option value="1">1</option><option value="2">2</option><option value="3">3</option></select><button @click="add">加</button><button @click="minus">减</button></div>
</template><script setup lang="ts" name="Count">
import { ref } from "vue";
import { useCountStore } from "@/store/count";//用pinia存储数据了,都是跟计算相关的const countStore = useCountStore();//以下两种方式都可以拿到state中的数据
// console.log(countStore.sum);//第一种获取数据的方式
// console.log(countStore.$state.sum);//第二种获取数据的方式//数据
const n = ref(1);function add(){
}function minus(){
}</script><style lang="css" scoped>
.count {background-color: skyblue;padding: 10px;border-radius: 10px;box-shadow: 0 0 10px;
}
.count * {margin-right: 5px;
}
</style>

4.修改数据 

<template><div class="count"><h2>当前求和为: {{ countStore.sum }}</h2><h3>欢迎来到: {{ countStore.school }} 坐落于 {{ countStore.address }}</h3><select v-model.number="n"><option value="1">1</option><option value="2">2</option><option value="3">3</option></select><button @click="add">加</button><button @click="minus">减</button></div>
</template><script setup lang="ts" name="Count">
import { ref } from "vue";
//引入useCountStore
import { useCountStore } from "@/store/count";//用pinia存储数据了,都是跟计算相关的
//使用useCountStore,得到一个专门保存count相关的store
const countStore = useCountStore();//以下两种方式都可以拿到state中的数据
// console.log(countStore.sum);//第一种获取数据的方式
// console.log(countStore.$state.sum);//第二种获取数据的方式//数据
const n = ref(1);function add(){//第一种修改方式// countStore.sum+=n.value;//第二种方式批量变更// countStore.$patch({//     sum:100,//     school:'尚硅谷',//     address:'beijing'// })// 第三种 方式countStore.increament(n.value);}function minus(){
}</script><style lang="css" scoped>
.count {background-color: skyblue;padding: 10px;border-radius: 10px;box-shadow: 0 0 10px;
}
.count * {margin-right: 5px;
}
</style>
import { defineStore } from 'pinia';
//hooks命名
//1参数 是id值,最好跟文件名保持一致
export const useCountStore = defineStore('count', {
//actions 里面放置的是一个一个的方法,用于响应组件中的动作actions: {increament(value){console.log('increament 调用了!',value);console.log(this.sum);//this 是当前的countStorethis.sum+=value}},//数据存储的地方state: () => {return {sum: 6,school: 'atguigu',address: '北京'}}})

5.storeToRefs

<template><div class="count"><h2>当前求和为: {{ sum }}</h2><h3>欢迎来到: {{ school }} 坐落于 {{ address }}</h3><select v-model.number="n"><option value="1">1</option><option value="2">2</option><option value="3">3</option></select><button @click="add">加</button><button @click="minus">减</button></div>
</template><script setup lang="ts" name="Count">
import { ref } from "vue";
import { storeToRefs } from "pinia";
//引入useCountStore
import { useCountStore } from "@/store/count";//用pinia存储数据了,都是跟计算相关的
//使用useCountStore,得到一个专门保存count相关的store
const countStore = useCountStore();
//storeToRefs 只会关注store中的数据,不会对方法进行ref包裹
const {sum,school,address} = storeToRefs(countStore);//将store中的数据映射到当前组件中,然后就可以直接使用//以下两种方式都可以拿到state中的数据
// console.log(countStore.sum);//第一种获取数据的方式
// console.log(countStore.$state.sum);//第二种获取数据的方式//数据
const n = ref(1);function add(){//第一种修改方式// countStore.sum+=n.value;//第二种方式批量变更// countStore.$patch({//     sum:100,//     school:'尚硅谷',//     address:'beijing'// })// 第三种 方式countStore.increament(n.value);}function minus(){countStore.sum-=n.value;
}</script><style lang="css" scoped>
.count {background-color: skyblue;padding: 10px;border-radius: 10px;box-shadow: 0 0 10px;
}
.count * {margin-right: 5px;
}
</style>

6.getters的使用 

相当于pinia的计算属性

import { defineStore } from 'pinia';
//hooks命名
//1参数 是id值,最好跟文件名保持一致
export const useCountStore = defineStore('count', {
//actions 里面放置的是一个一个的方法,用于响应组件中的动作actions: {increament(value:number){console.log('increament 调用了!',value);console.log(this.sum);//this 是当前的countStorethis.sum+=value}},//数据存储的地方state: () => {return {sum: 6,school: 'atguigu',address: '北京'}},getters:{bigsum(){return this.sum*10;},bigschool(store):string{console.log(store);return store.school.toUpperCase();}}})
const {sum,bigschool,address,bigsum} = storeToRefs(countStore);

7.$subscribe

<template><div class="talk"><button @click="getLoveTalk">获取一句土味情话</button><ul><li v-for="item in talkList" :key="item.id">{{ item.talk }}</li></ul></div>
</template><script setup lang="ts" name="LoveTalk">
import { useLoveTalkStore } from "@/store/loveTalk";
import { storeToRefs } from "pinia";
const loveTalkStore = useLoveTalkStore();const { talkList } = storeToRefs(loveTalkStore);loveTalkStore.$subscribe((mutate,state)=>{console.log('talkStore里面保存的数据发生了变化');console.log(mutate);localStorage.setItem('talkList',JSON.stringify(state.talkList))console.log(state);})function getLoveTalk() {loveTalkStore.getTalk();
}
</script><style lang="css" scoped>
.talk {background-color: orange;padding: 10px;border-radius: 10px;box-shadow: 0 0 10px;
}
</style>
import { defineStore } from "pinia";
import axios from "axios";
import { nanoid } from "nanoid";
export const useLoveTalkStore = defineStore('loveTalk', {actions:{async getTalk(){let {data: { content: talk },} = await axios.get("https://api.uomg.com/api/rand.qinghua?format=json");// talkList.push({//     id:nanoid(),//     talk// })this.talkList.push({id: nanoid(),talk: talk,});}},state: () => {return {talkList: JSON.parse(localStorage.getItem('talkList') as string || '[]')}}
})

8.store组合式写法

import { defineStore } from 'pinia';
//hooks命名
//1参数 是id值,最好跟文件名保持一致
// export const useCountStore = defineStore('count', {
// //actions 里面放置的是一个一个的方法,用于响应组件中的动作
//     actions: {
//         increament(value:number){
//             console.log('increament 调用了!',value);
//            console.log(this.sum);//this 是当前的countStore
//            this.sum+=value//         }
//     }
//     ,
//     //数据存储的地方
//     state: () => {
//         return {
//             sum: 6,
//             school: 'atguigu',
//             address: '北京'
//         }
//     },
//     getters:{
//         bigsum(){
//             return this.sum*10;
//         },
//         bigschool(store):string{
//             console.log(store);//             return store.school.toUpperCase();
//         }
//     }// })import { ref ,computed} from 'vue';
export const useCountStore = defineStore('count',()=> {const sum = ref(0)const school = ref('atguigu')const address = ref('北京')const bigsum = computed(()=>{return sum.value*10;})const bigschool = computed(()=>{return school.value.toUpperCase();})function increament(value:number){console.log('increament 调用了!',value);console.log(sum.value);//this 是当前的countStoresum.value+=value}return {sum,school,address,bigsum,bigschool,increament};})

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C++设计模式6:适配器模式
  • 使用GitHub Actions的Self-hosted runner
  • leetcode541:反转字符串II
  • io进程----文件io
  • 8月27日,每日信息差
  • 【深度学习】爱因斯坦求和约定
  • STM32 - 笔记3
  • 最新网站服务器CC压力测试系统源码
  • 开源 AI 智能名片 O2O 商城小程序在社交私域中的圈层价值
  • 【卡梅德生物】羊驼单抗定制:从单B细胞筛选到应用
  • Web开发:通过Quatz开启定时任务调度的基础demo
  • 【JVM】垃圾回收算法(一)
  • c++核心编程指南
  • k8s备份etcd3.5
  • jenkins任务中无法执行sudo,管理员操作
  • 【附node操作实例】redis简明入门系列—字符串类型
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • CentOS 7 修改主机名
  • HTML中设置input等文本框为不可操作
  • python 装饰器(一)
  • Python进阶细节
  • 安卓应用性能调试和优化经验分享
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 两列自适应布局方案整理
  • 前端临床手札——文件上传
  • 思维导图—你不知道的JavaScript中卷
  • 温故知新之javascript面向对象
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​VRRP 虚拟路由冗余协议(华为)
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • ​字​节​一​面​
  • #Linux(权限管理)
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (1)常见O(n^2)排序算法解析
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (补)B+树一些思想
  • (二十九)STL map容器(映射)与STL pair容器(值对)
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (函数)颠倒字符串顺序(C语言)
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (篇九)MySQL常用内置函数
  • (四)c52学习之旅-流水LED灯
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (转)大道至简,职场上做人做事做管理
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • (自用)仿写程序
  • **python多态
  • .form文件_SSM框架文件上传篇
  • .naturalWidth 和naturalHeight属性,
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查