外观
外观
怡然
405字约1分钟
2024-06-19
pinia
环境npm install pinia
main.ts
中引入import {createPinia} from 'pinia'
const pinia=createPinia()
app.use(pinia)
src
中新建一个 store
文件夹,里面新建相关的storeimport {defineStore} from 'pinia'
export const useCountStore = defineStore('count',{
state(){
return {
sum:6,
school:'firstSchool',
address:'GaoxinStreet'
}
},
actions:{ // 放置方法,用于相应组件中的动作
increment(value:number){
if(this.sum<10){
this.sum += value // this表示useCountStore
}
},
},
getters:{ // 类似与计算属性,可以用state也可以用this
bigSum(state){
return state.sum*10
},
// 也可以写为:
// bigSum:state=>state.sum*10 // 注意箭头函数不可以用this
upperSchool():string{
return this.school.toUpperCase
}
}
})
import { storeToRefs } from "pinia"
import {useCountStore} from '@/store/count.ts'
const countStore = useCountStore()
console.log(countStore.sum) //6
console.log(countStore.$state.sum) //6
// 如需解构赋值,使用storeToRefs只关注pinia里的数据
const {sum,school,address,bigSum,upperSchool} = storeToRefs(countStore)
function add(){
countStore.sum+=1
}
function add(){
countStore.$patch({
sum:sum+1,
school:'第一中学',
address:'高新大道'
})
}
action
修改let n = ref(3)
function add(){
countStore.increment(n.value)
}
$subscribe
订阅countStore.$subscribe((mutate,state)=>{
console.log(mutate,state)
})
提示
该方法类似于watch方法,监听store里数据的变化,可以在数据变化时执行一些操作
pinia
的组合式写法import {defineStore} from 'pinia'
import axios from 'axios'
import {nanoid} from 'nanoid' // 随机生成不唯一ID的插件
import {reactive} from 'vue'
export const useTalkStore = defineStore('talk',()=>{
// talkList就是state
const talkList = reactive(
JSON.parse(localStorage.getItem('talkList') as string) || []
)
// getATalk函数相当于action
async function getATalk(){
let {data:{content:title}} = await axios.get('https://api.uomg.com/api/rand.qinghua?format=json')
let obj = {id:nanoid(),title}
talkList.unshift(obj)
}
return {talkList,getATalk}
})