• vue3中的pinia


    vue3的pinia集中式状态管理

        下载安装pinia 或者是在下载脚手架的时候把pinia勾选上

        如果未勾选,那么就在main.ts中引入

         import {createPinia} from 'vue' //在App.vue后面引入

         const pinia=createPinia() //在创建App后面创建

         app.use(pinia)

        store 是一个保存:状态、业务逻辑的实体,每个组件都可以读取、写入它

        它有三个概念:state、getter、action,相当于组件中的data\computed和methods.

        具体编码:src/store/count.ts

        import {defineStore} from 'pinia'

        export const useCountStore=defineStore('count',{

        actions: { },  //动作

        state(){      //状态

            return {

                sum: 6,

                school:'迪思'

            }

        },

        getters:{}    //计算

        })

        修改数据的三种方式

        1直接修改

        countStore.sum=789

        第二种批量修改

         constStore.$patch({

            sum:888,

            school:'明德'

         })

        第三种: 借助action修改(action中可以编写一些业务逻辑)

    1.     import {defineStore} from 'pinia';
    2.       export const useCountStore=defineStore('count',{
    3.         actions:{
    4.             increment(value){
    5.                 if(this.sum<10){
    6.                     this.sum+=value
    7.                 }
    8.             }
    9.         }
    10.       })

        storeToRefs只会关注store中的数据,不会对方法进行包裹,只是让数据变成响应式的

        在要使用的的页面需要引入你使用的数据

        import{useCountStore} from'@/store/count';

        import {storeToRefs} from  'pinia';

        const countStore=useCountStore()

        上面的几种修改方式需要在页面定义一个方法,把修改的方式放置在方法里面

        页面中的{{countStore.xxx}}可以简写{{xxx}}

        前提是要解构 const {xxx,yyy,ddd,zzzz}=storeToRefs(useCountStore)

        countStore.incremnet(n.value)  //n是定义的响应式数据

        getters:{}    //计算

        getters: {

            fangdaSum(state){

                return  state.sum*10

            }

        }

        getters: {

         fangdaSum :state=>state.sum*5,

        }

        getters: {

        changeSchool(state){

            return state.school = '第一中学'//   return  this.school.toUpperCase()

        }

        }

        在pinia中的actions中通过调接口拿数据  在 store下的ts文件中

        nanoid 是一个插件,用来生成随机的id

    1.   import { nanoid } from 'nanoid'
    2.     export const useTalkStore = defineStore('talk', {
    3.         actions: {
    4.             async getlovetalk() {
    5.                 //发送请求+连续解构赋值+重命名
    6.                 let { data: { content: title } } = await axios.get('https:/api/link/url/rand');
    7.                 //把请求回来的字符串,包装成一个对象
    8.                 let obj = { id: nanoid(), title };
    9.                 //放到定义的数组中
    10.                 this.talkList.unshift(obj)
    11.             }
    12.         },
    13.         state(){
    14.             return {
    15.                 talkList:JSON.parse(localStorage.getItem('talkList') as string)|| []
    16.             }
    17.         },
    18.     })
    1.   另一种写法  组合式
    2.     import { reactive } from 'vue';
    3.     export const useTalkStore = defineStore('talk', () => {
    4.         //talkList相当于state
    5.         const talkList = reactive(JSON.parse(localStorage.getItem('talkList') as string) || [])
    6.         //   getlovetalk相当于actions
    7.         async function getlovetalk() {
    8.             //发送请求+连续解构赋值+重命名
    9.             let { data: { content: title } } = await axios.get('https:/api/link/url/rand');
    10.             //把请求回来的字符串,包装成一个对象
    11.             let obj = { id: nanoid(), title };
    12.             //放到定义的数组中
    13.             talkList.unshift(obj)
    14.         }
    15.         return { talkList, getlovetalk }
    16.     })


      在需要使用的页面

        import { useTalkStore } from '@/store/loveTalk';

        import { storeToRefs } from 'pinia';

        const talkStore = useTalkStore();

        const { talkList } = storeToRefs(talkStore)

        talkStore.$subscribe((mutate, state) => {

            console.log('talkStore里面保存的数据发生了变化', mutate, state)

            //mutate 请求回来的数据的形式

            //state  以数组的形式展示所有请求的数据+以前的数据

            localStorage.setItem('talkList', JSON.stringify(state.talkList))

        })

        function getlovetalk() {

            talkStore.getlovetalk()

        }

  • 相关阅读:
    【CSS布局】实现中间自适应,左右宽度固定的三栏布局
    Pyspider 使用带认证redis集群作为消息队列
    java计算机毕业设计政务大厅管理系统源程序+mysql+系统+lw文档+远程调试
    Apipost连接数据库详解
    cento常用命令
    二叉搜索树(从0-1手把手讲解)
    最新腾讯面试题汇总--C++后端开发岗(部分含答案)
    vue使用本地图片设置为默认图
    【MySql】MySQL概述及其语法概述
    当Number类型的id超过16位时,JavaScript的数据处理和储存问题
  • 原文地址:https://blog.csdn.net/weixin_72324200/article/details/136371423