Pinia图标
// 返回一个函数,该函数的命名有自己的规范
const useCounter = defineStore("counter", {state: () => ({count: 99, })
})
Home View
count: {{ counterStore.count }}
const { count } = counterStore // 不是响应式的
// 原来的响应式的方式
// const { count } = toRefs(counterStore)
// 现pinia的响应式的方式
const { count } = storeToRefs(counterStore)
const useUser = defineStore('user', {state: () => ({name: 'why',age: 18,level: 100})
})
读取和写入state
const userStore = useUser()const { name, age, level } = storeToRefs(userStore)function changeState() {// 1、一个个修改状态// userStore.name = 'kobe'// userStore.age = 24// userStore.level = 200
}
重置State
function resetState() {// 将原来的状态返回userStore.$reset() }
改变State
// 2、一次性修改多个状态
// userStore.$patch({
// name:'james',
// age:35
// })
替换State
// 替换state为新的对象
userStore.$state = {name:'curry', level:200
}
Getters相当于Store的计算属性
getters: {// 1、基本使用,你要对state操作,必须传入statedoubleCount(state) {return state.count * 2 // 这里也可以通过this来访问},doubleCount: (state) => state.counter * 2
}
const countStore = useCounter()
console.log(countStore.doubleCount)
// 2、在一个getter引入另一个getter
doubleCountAddOne() {// this就是store实例return this.doubleCount + 1
},
// pinia拥有扁平化的特点,意味着每个东西都是独立的
import useUser from "./user";// 返回一个函数,该函数的命名有自己的规范
const useCounter = defineStore("counter", {state: () => ({count: 99,friends: [{ id: 111, name: 'why' },{ id: 112, name: 'kobe' },{ id: 113, name: 'james' }]}),getters: {// 4、getters中用到了别的store中的数据showMessage(state) {// 1、先获取user信息const userStore = useUser()// 2、获取自己的信息// 3、拼接信息return `name:${userStore.name}-count:${state.count}`}}
// 3、getters也支持返回一个函数
getFriendById(state) {// 别人在用这个的时候,实际上拿到的是一个函数return function (id) {// 使用普通函数来进行查找for (let i = 0; i < state.friends.length; i++) {const friend = state.friends[i]if (friend.id === id) {return friend}}}
},// 在别的组件中使用的时候,可以直接传入参数
Home View
friend-111 {{ countStore.getFriendById(111) }}
Actions相当于组件中的methods
// counter.js
actions:{increment(num) {// console.log(state) // undefinedthis.count += num}}// home.jsactions:{async fetchHomeMultidata() {const res = await fetch("http://123.207.32.32:8000/home/multidata")const data = await res.json() // console.log(data)this.banners = data.data.banner.listthis.recommends = data.data.recommend.list// 类似于return undefined// return Promise.resolve(undefined)// 也可以// return new Promise(async(resolve, reject))}}// 在别的组件中使用
// axios中的业务逻辑一般指的是网络请求等
const homeStore = useHome()
// homeStore.fetchHomeMultidata()
// 通过homeStore可以获取到异步数据
homeStore.fetchHomeMultidata().then(console.log('请求已经完成')
)
pinia练习