1、搭建pinia环境
cnpm i pinia #安装pinia的组件
cnpm i nanoid #唯一id,相当于uuid
cnpm install axios #网络请求组件
2、存储+读取数据
存储数据
>> Count.ts文件
import {defineStore} from 'pinia'
export const useCountStore = defineStore('count',{
// actions里面放置的是一个一个的方法,用于响应组件中的“动作”
actions:{
increment(value:number){
console.log("increment被调用了",value)
// 修改数据(this是当前的store)
this.sum += value
}
},
// 真正存储数据的地方
state(){
return {
sum:6,
school:'attth',
address:'bbhsh'
}
}
})
读取数据
>> Count.vue 文件
<template>
<div class="count">
<!-- <h2>当前求和为:{
{sum}}</h2> -->
<h2>当前求和为:{
{sum}},放大10倍:{
{ bigSum }}</h2>
<h3>{
{ school }},变成大写:{
{ upperSchool }} {
{ 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="App">
import {ref,toRefs} from 'vue';
import {useCountStore} from '@/store/count'
import {storeToRefs} from 'pinia'
// 使用userCountStore,得到一个专门保存count相关的store
const countStore = useCountStore()
console.log(countStore)
//使用toRefs会导致countSotre下的所有属性和方法都变成响应式,代价太大
const {sum,school,address} = toRefs(countStore)
</script>
<style scoped>
.count {
background-color: skyblue;
padding: 10px;
border-radius: 10px;
box-shadow: 0 0 10px;
}
select,button {
margin: 0 5px;
height: 25px;
}
</style>
3、修改数据
// let sum = ref(1) //当前求和
let n = ref(1) //用户选择的数字
// 方法
function add(){
// 第一种修改方式
// countStore.sum += 1
// 第二种修改方式
// countStore.$patch({
// sum:888,
// // school:'哈哈',
// // address:'南京'
// })
// 第三种修改方式
countStore.increment(n.value)
}
function minus(){
countStore.sum -= n.value
}
4、_storeToRefs
//使用toRefs会导致countSotre下的所有属性和方法都变成响应式,代价太大
// const {sum,school,address} = toRefs(countStore)
// console.log('!!!!',toRefs(countStore))
// storeToRefs 只会关注store中的数据,不会关注里面的方法
const {sum,school,address,bigSum,upperSchool} = storeToRefs(countStore)
5、getters的使用
import {defineStore} from 'pinia'
export const useCountStore = defineStore('count',{
// actions里面放置的是一个一个的方法,用于响应组件中的“动作”
actions:{
increment(value:number){
console.log("increment被调用了",value)
// 修改数据(this是当前的store)
this.sum += value
}
},
// 真正存储数据的地方
state(){
return {
sum:6,
school:'attth',
address:'bbhsh'
}
},
getters:{ // 对数据不满意进行处理
// bigSum(state){
// return state.sum*10
// },
bigSum:state => state.sum * 10,
// upperSchool(state){
// return state.school.toUpperCase()
// }
upperSchool():string{
return this.school.toUpperCase()
}
}
})
6、_$subscribe的使用
//可以实现刷新不丢失
talkStore.$subscribe((mutate,state)=>{
console.log('talkStore里面保存的数据发生了变化')
localStorage.setItem("talkList",JSON.stringify(state.talkList)) //浏览器的本地存储
})
state(){
return {
talkList: (JSON.parse(localStorage.getItem('talkList') as string) || [])
}
}
7、_store组合式写法
import {reactive} from 'vue'
export const useTalkStore = defineStore('talk',()=>{
// talkList就是state
const talkList = reactive(JSON.parse(localStorage.getItem('talkList') as string) || [])
// getAtalk函数相当于actions
async function getATalk(){
//发请求,下面这行的写法是:连续解构赋值+重命名
let {data:{content:title}} = axios.get("http://xxxxx/api/rand?format=json")
// console.log(data)
//把请求回来的字符串,包装成一个对象
let obj = {id:nanoid(),title}
talkList.unshift(obj)
}
return {talkList,getATalk}
})