vue3 ts pinia
一、安装
npm install pinia
二、构建(main.ts)
1、引入
2、生成
3、使用
import { createApp } from 'vue'
import App from './App.vue'
import router from '@/router'
// 1.引入
import {createPinia} from 'pinia'
const app = createApp(App)
// 2、生成
let pinia = createPinia()
app.use(router)
// 3.引用
app.use(pinia)
app.mount('#app')
三、存储、读取、修改
1、存储
a、新建src/store/xx.ts,xx与组件名相同,用于区分
b、命名规则:use文件名Stroe,'文件名'
import {defineStore} from 'pinia'
export const useCountStore = defineStore('count', {
// 存储数据
state() {
return{
sum: 10,
name:'jojo'
}
},
// 修改数据复杂逻辑
actions:{},
// state 简单数据操作
getters:{
maxSum(state){
return state.sum * 10
},
upperName:state=>state.name.toUpperCase()
}
})
2、读取数据
a、引入store
b、生成
c、使用
<template>
<div class="count">
<h2>结果:{{ countStroe.sum }}</h2>
<h2>姓名:{{ countStroe.upperName }}</h2>
<select v-model="n">
<option :value="1">1</option>
<option :value="2">2</option>
<option :value="3">3</option>
</select>
<button @click="add">加法</button>
<button @click="sub">减法</button>
</div>
</template>
<script lang="ts" setup name="Count">
import { ref } from "vue";
// 1.引入
import { useCountStore} from '@/store/count'
// 2.生成
let countStroe = useCountStore()
let n = ref(1)
function add(){
// sum.value += n.value
}
function sub(){
// sum.value -= n.value
}
</script>
3、使用
1、修改单个(直接)
function add(){ // 1、简单修改 countStroe.sum += n.value }
2、批量修改($patch)
// 2.批量修改,键值对 countStroe.$patch({ sum:20, name:'fake' })
3、复杂逻辑(action)
a、store中对应的ts文件中,action中,写方法
b、在组件中调用 xx.Store.方法(参数)
数据调用
// add 是 store对象ts中 action的方法 countStroe.add(n.value)
修改方法
import {defineStore} from 'pinia'
export const useCountStore = defineStore('count', {
// 存储数据
state() {
return{
sum: 10,
name:'jojo'
}
},
// 修改数据复杂逻辑
actions:{
add(value){
this.sum += value
}
},
// state 简单数据操作
getters:{
maxSum(state){
return state.sum * 10
},
upperName:state=>state.name.toUpperCase()
// upperName(state){
// return state.name.toUpperCase
// }
}
})
四、简化模板变量长度
1、过程
引入、解构
// 1.引入 import { useCountStore} from '@/store/count' import {storeToRefs} from 'pinia' // 2.生成 let countStroe = useCountStore() // 解构 let {sum, upperName} = storeToRefs(countStroe)
2、简化前
<h2>结果:{{ countStroe.sum }}</h2>
<h2>姓名:{{ countStroe.upperName }}</h2>
3、简化后
<h2>结果:{{ sum }}</h2>
<h2>姓名:{{ upperName }}</h2>
五、$subscribe 订阅
1、当store中state的数据发生变化时,调用(执行)这个方法
2、例子
talkStore.$subscribe((mutate:any, state:any)=>{ console.log(mutate); // state数据变化 console.log(state); })
六、pinia的另一种 组合式写法,之前的是键值对写法,下面的是函数写法(在一起)(推荐)
import {defineStore} from 'pinia'
import {reactive} from 'vue'
import {nanoid} from 'nanoid';
// export const useTalkStore = defineStore('talk',{
// state() {
// return{
// talkList: reactive([
// {id:'01', content:'想送你很多很多口红,让你每天还我一点点'},
// {id:'02', content:'有一天我会拉着你的手,带你去看你最喜欢的星空'}
// ])
// }
// },
// actions:{
// insert(){
// let taklData = {id:nanoid() ,content:"哈哈"}
// this.talkList.unshift(taklData)
// }
// },
// getters:{}
// })
export const useTalkStore = defineStore('talk',()=>{
// 相当于state
let talkList = reactive([
{id:'01', content:'想送你很多很多口红,让你每天还我一点点'},
{id:'02', content:'有一天我会拉着你的手,带你去看你最喜欢的星空'}
])
// 相当于action
function insert(){
let taklData = {id:nanoid() ,content:"哈哈"}
talkList.unshift(taklData)
}
return {talkList, insert}
})

浙公网安备 33010602011771号