您当前的位置: 首页 > 

梁云亮

暂无认证

  • 1浏览

    0关注

    1211博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【精品】pinia详解

梁云亮 发布时间:2022-06-28 12:17:28 ,浏览量:1

简介

pinia是最新一代的轻量级状态管理插。 优点:

  • 简便,存储和组件变得很类似,你可以轻松写出优雅的存储。 = 类型安全,通过类型推断,可以提供自动完成的功能。 = vue devtools 支持,可以方便进行调试。 = Pinia 支持扩展,可以非常方便地通过本地存储,事物等进行扩展。
  • 模块化设计,通过构建多个存储模块,可以让程序自动拆分它们。
  • 非常轻巧,只有大约 1kb 的大小。
  • 服务器端渲染支持。
  • 完整的 ts 的支持;
  • 去除 mutations,只有 state,getters,actions;
  • actions 支持同步和异步;
  • 代码扁平化没有模块嵌套,只有 store 的概念,store 之间可以自由使用,每一个store都是独立的
  • 无需手动添加 store,store 一旦创建便会自动添加;
  • 支持Vue3 和 Vue2
安装配置
  • 安装命令:
npm install pinia -S
  • main.ts配置
import {createPinia} from 'pinia'

const store= createPinia()
app.use(store)
通过state修改
  • 在state/index.ts文件中编写:
import {defineStore} from "pinia"

export const useUserStore = defineStore('user', {
    state: () => {
        return {
            name:'',
            age: 0
        }
    }
})
  • Demo.vue

  {{ user .name }}------{{ user .age }}
  
  直接修改
  批量修改
  批量修改:函数式写法
  修改所有的值



import {useUserStore} from "@/store";
const user = useUserStore()

const  fun1 = ()=>{
  //$patch方法可以批量修改多个值
  user.$patch({
    name:'张三',
    age:1234
  })
}
const  fun2 = ()=>{
  //此处可以编写业务逻辑(推荐使用)
  user.$patch((state)=>{
    if (state.name ==''){
      state.age =6666
    }else {
      state.age =8888
    }
  })
}
const  fun3 = ()=>{
  //$state:设置为新对象来替换store的整个状态。缺限:必须修改所有的值
  user.$state = {
    name:'zhangsan',
    age :3333
  }
}

  • 结果 请添加图片描述
通过actions修改

在actions中可以做同步也可以做异步操作。 actions中的方法可以相互调用。

  • store/index.ts
import {defineStore} from "pinia"

export const useCountStore = defineStore('count', {
    state: () => {
        return {
            count: 0
        }
    },
    actions: {
        increment() {
            this.count++
        },
        setCount(p: number) {
            this.count = p
        },
        //异步操作
        decrement() {
            setTimeout(() => {
                this.count--
            }, 1000)
        },
        async sth(){
            const tmp = await 1234
            this.count = tmp
            this.setCount(7878)  //调用
        }
    }
})
  • Demo.vue

  {{ counter.count }}
  
  借助actions修改
  借助actions修改
  异步操作
  异步操作



import {useCountStore} from "@/store";
const counter = useCountStore()
//借助actions修改
const fun1 = ()=>{
  counter.increment()
}
//借助actions修改
const fun2 = ()=>{
  counter.setCount(789)
}

  • 结果 在这里插入图片描述
getters

不管调用多少次,getters中的函数只会执行一次,且都会缓存

  • store/index.ts
import {defineStore} from "pinia"

export const useCountStore = defineStore('count', {
    state: () => {
        return {
            count: 10
        }
    },
    getters: {
        //普通函数形式,可以使用this
        getCount(): number {
            return this.count
        },
        //箭头函数形式,不能使用this
        newCount: (state): number => {
            return state.count + 5
        },
        getDoubleCount(state): number {
            return state.count * 2 + this.getCount
        }
    }
})
  • Demo.vue

  {{counter.count}} 
  {{ counter.getCount }} 
  {{ counter.getCount }} 
  {{ counter.newCount }} 
  {{ counter.getDoubleCount }} 



import {useCountStore} from "@/store";
const counter = useCountStore()

  • 结果 在这里插入图片描述
解构对象

解构主要是针对Store中的state和getters.

示例一
  • store/index.js
import {defineStore} from "pinia"

export const useCountStore = defineStore('count', {
    state: () => {
        return {
            count: 10
        }
    },
    getters: {
        //普通函数形式,可以使用this
        getCount(): number {
            console.info("getCount")
            return this.count
        }
    },
    actions: {
        increment() {
            console.info("increment")
           this.count++
        }
    },
})
  • Demo.vue

  响应式:{{counter.count}} 
  属性解构后丧失响应式:{{ count }} 
  getters方法解构后丧失响应式:{{getCount}}
  
  属性解构后丧失响应式
  actions方法解构后不会丧失响应式



import {useCountStore} from "@/store";

const counter = useCountStore()
//解构
const {count, getCount, increment} = counter

const fun = () => {
  counter.count++
  //属性解构后丧失响应式
  console.info(count)
}

  • 效果 请添加图片描述
示例二
  • store/index.js
import {defineStore} from "pinia"

export const useCountStore = defineStore('count', {
    state: () => {
        return {
            count: 10
        }
    },
    getters: {
        //普通函数形式,可以使用this
        getCount(): number {
            console.info("getCount")
            return this.count
        }
    },
    actions: {
        increment() {
            console.info("increment")
           this.count++
        }
    },
})
  • Demo.vue

  响应式:{{counter.count}} 
  属性解构后丧失响应式:{{ count }} 
  getters方法解构后丧失响应式:{{getCount}}
  
  属性解构后丧失响应式



import {useCountStore} from "@/store";
import {storeToRefs} from "pinia";

const counter = useCountStore()
//解构
const {count, getCount} = storeToRefs(counter)

const fun = () => {
  counter.count++
  //属性解构后丧失响应式
  console.info(count)
}

  • 效果 请添加图片描述
pinia常用API
  • store/index.ts
import {defineStore} from "pinia"

export const useCountStore = defineStore('count', {
    state: () => {
        return {
            count: 10
        }
    },
    actions: {
        increment() {
            console.info("increment")
            this.count++
        }
    },
})
  • Demo.vue

  {{counter.count}}
  
  自增
  actions:自增
  重置状态数据到最终状态



import {useCountStore} from "@/store";
const counter = useCountStore()
//state发生改变时触发
counter.$subscribe((args,state)=>{
  console.info(args,state)
})

//监听actions中的方法
counter.$onAction(args=>{
  console.info(args)
  args.after(()=>{
    console.info("after")
  })
})

  • 结果
关注
打赏
1665409997
查看更多评论
立即登录/注册

微信扫码登录

0.0417s