vue下一代状态管理Pinia.js 保证你看的明明白白!(下)

简介: vue下一代状态管理Pinia.js 保证你看的明明白白!

7.getters的使用


//src/store/user.ts 文件
import { defineStore } from 'pinia'
export const useUserStore = defineStore({
    id: 'userkey', // id必填,且需要唯一
    // state是存放数据的  
    state: () => {
        return {
            name: '于途',
            likelist:[],
            sex:'男',
            work:'写代码',
            heigt:'1.70cm',
            age:26,
        }
    },
    // actions 可以修改state中的值,这里面提供方法
    actions:{
        // 修改name中的数据
        updataName(name:string){
            this.name=name
        },
    },
    // Getter 完全等同于 Store 状态的计算值
    getters:{
        // 将姓名进行更改
        getName: (state) => {
            return state.name + 'hahha~!'
        }
    }
})
//使用的页面.vue
<template>
    <div class="pinia">
       <h2> 学习pinia </h2>
        <div>姓名:{{ asName }}</div>
        <div>性别:{{ mysex }}</div>
        <div>工作:{{ work }}</div>
        <div>身高:{{ heigt }}</div>
        <div>身高:{{ age }}</div>
        <!-- 这里就直接使用了getters中的方法  -->
          姓名:{{ userStore.getName }}
        <el-button type="primary" @click="changeHander">修改name</el-button>
    </div>
</template>
<script setup lang='ts'>
import { storeToRefs } from 'pinia'
import { useUserStore } from '../../store/user'
const userStore = useUserStore()
// asName 和 mysex 是我取的别名
const { name : asName ,sex:mysex,
   work, heigt,age 
} = storeToRefs(userStore)
const changeHander=()=>{
    userStore.updataName('小玉兔')
}
</script>

1425695-20220425172319611-1872434875.png

对于getters的使用的说明


Getter 完全等同于 Store 状态的计算值 computed.


并不会影响原始数据


9.异步actions-设置state中的值


//src/store/user.ts 文件
import { defineStore } from 'pinia'
// 引入接口
import { getUser } from "../https/api";
export const useUserStore = defineStore({
    id: 'userkey', // id必填,且需要唯一
    // state是存放数据的  
    state: () => {
        return {
            name: '于途',
            likelist:[],
        }
    },
    // actions 可以修改state中的值,这里面提供方法
    actions:{
        // 修改name中的数据 同步
        updataName(name:string){
            this.name=name
        },
        // 异步-获取远端的数据
        loadUserList(){
            getUser({}).then(res=>{
                this.likelist = res
            })
        }
        // 使用await和async 第二种方法
        // async loadUserList(){
        //     const list = await getUser({})
        //     console.log('list',list)
        //     this.likelist = list
        // }
    },
})
使用的页面
<template>
    <div class="pinia">
       <h2> 学习pinia </h2>
         数据 {{ userStore.likelist}}
        <el-button type="primary" @click="changeHander">获取远端数据</el-button>
    </div>
</template>
<script setup lang='ts'>
import { storeToRefs } from 'pinia'
import { useUserStore } from '../../store/user'
const userStore = useUserStore()
const changeHander=()=>{
    // 异步调用
    userStore.loadUserList() // 加载所有数据
}

1425695-20220425172432938-990569948.gif


10.actions 中互相调用方法


很多时候,我们可能会出现 actions中互相去调用方法。


这个时候怎么去处理呢?  


通过this.方法名(参数)

//src/store/user.ts 文件
import { defineStore } from 'pinia'
// 引入接口
import { getUser } from "../https/api";
export const useUserStore = defineStore({
    id: 'userkey', // id必填,且需要唯一
    // state是存放数据的  
    state: () => {
        return {
            name: '于途',
            likelist:[],
        }
    },
    // actions 可以修改state中的值,这里面提供方法
    actions:{
        // 修改name中的数据 同步
        updataName(name:string){
            this.name=name
        },
        // 异步-获取远端的数据
        loadUserList(){
            getUser({}).then(res=>{
                this.likelist = res
                this.sayHi('互相调用方法')
            })
        },
        sayHi(mess:string){
            console.log('loadUserList方法中调用了sayHi',mess)
        }
    },
})

使用的页面.vue

<template>
    <div class="pinia">
       <h2> 学习pinia </h2>
        数据 {{ userStore.likelist}}
        <el-button type="primary" @click="changeHander">获取远端数据</el-button>
    </div>
</template>
<script setup lang='ts'>
import { storeToRefs } from 'pinia'
import { useUserStore } from '../../store/user'
const userStore = useUserStore()
const changeHander=()=>{
    // 异步调用
    userStore.loadUserList() // 加载所有数据
}
</script>

image.gif


11.数据持久化-sessionStorage 或 localStorage


我们都知道,vuex刷新后,数据会丢失。


这个时候我们需要将数据进行持久化。


我们可以考虑sessionStorage或者localStorage


//src/store/user.ts 文件
import { defineStore } from 'pinia'
// 引入接口
import { getUser } from "../https/api";
export const useUserStore = defineStore({
    id: 'userkey', // id必填,且需要唯一
    // state是存放数据的  
    state: () => {
        return {
            // 数据持久化使用的是sessionStorage
            name: sessionStorage.getItem('name') ? sessionStorage.getItem('name') :  '于途',
            likelist:[],
        }
    },
    actions:{
        // 修改name中的数据 同步
        updataName(name:string){
            sessionStorage.setItem('name', name)
            this.name=name
        },
    },
})
<template>
    <div class="pinia">
       <h2> 学习pinia </h2>
         姓名 {{ userStore.name}}
        <el-button type="primary" @click="changeHander">该变值</el-button>
    </div>
</template>
<script setup lang='ts'>
import { storeToRefs } from 'pinia'
import { useUserStore } from '../../store/user'
const userStore = useUserStore()
const changeHander=()=>{
    // 异步调用
    userStore.updataName('我改变了姓名') 
}
</script>

1425695-20220425172508454-943242866.gif


12.跨模块修改数据


虽然我不建议跨模块修改数据。


因为这样可能会导致你的应用数据流向变得难以理解。


但是有些时候确实需要跨模块修改数据。


那么pinia怎么去处理跨模块修数据呢?


下面我们一起来探索跨模块修改数据!


假设admin模块需要去修改user模块中的数据


admin.ts代码如下


//src/store/admin.ts 文件
import { defineStore } from 'pinia'
// 引入user模块
import { useUserStore } from './user'
export const adminUserStore = defineStore({
    id: 'adminkey', 
    actions:{
      // 通过引入的useUserStore模块,然后去触发它里面对应的方法。
       editUserModuleValue(name:string){
           //  userStore可以看见整个user模块中的数据和方法
           let userStore=useUserStore()
           console.log('userStore',userStore)
           userStore.updataName(name)
       }
    },
})


user.ts代码


//src/store/user.ts 文件
import { defineStore } from 'pinia'
// 引入接口
export const useUserStore = defineStore({
    id: 'userkey', // id必填,且需要唯一
    // state是存放数据的  
    state: () => {
        return {
            name: '于途',
            likelist:[],
            sex:'男',
            work:'写代码',
            heigt:'1.70cm'
        }
    },
    actions:{
        // 修改name中的数据 同步
        updataName(name:string){
            this.name=name
        },
    },
})


页面的使用


<template>
    <div class="pinia">
       <h2> 学习pinia </h2>
         姓名 {{ userStore.name}}
        <el-button type="primary" @click="changeHander">该变值</el-button>
    </div>
</template>
<script setup lang='ts'>
import { storeToRefs } from 'pinia'
// 引入admin模块
import { adminUserStore } from '../../store/admin'
// 引入user模块
import { useUserStore } from '../../store/user'
const adminStore = adminUserStore()
const userStore = useUserStore()
// dmin模块需要去修改user模块中的数据
const changeHander=()=>{
    adminStore.editUserModuleValue('数据数据')
}
</script>



1425695-20220425173749457-1146480501.gif


尾声


如果你觉得我写的不错的话,可以给我推荐、打赏、评论!


上一个给我打赏的小伙伴都已经找到女朋友了!


咦!你不信,不信你给我打赏看一下!


保准你追到到喜欢的Ta!


你不会追,哎!难受。


我教你,你可以这样说:


小生不才,斗胆-问,不知姑娘是否心系他人。


感情之事,在下不敢儿戏!


如若姑娘早已心系他人。那在下便不再打扰。


如若有所唐突还望姑娘多加体谅!


若姑娘非我良人,那在下就不庸人自恼。


在下怕越陷越深,还望姑娘尽早告知!话已至此,我便先在此谢过!


拿去不谢!回头告诉我结果啊!


咦!抓住一个没有打赏的小伙伴!

相关文章
|
5月前
|
存储 监控 算法
公司内部网络监控中的二叉搜索树算法:基于 Node.js 的实时设备状态管理
在数字化办公生态系统中,公司内部网络监控已成为企业信息安全管理体系的核心构成要素。随着局域网内终端设备数量呈指数级增长,实现设备状态的实时追踪与异常节点的快速定位,已成为亟待解决的关键技术难题。传统线性数据结构在处理动态更新的设备信息时,存在检索效率低下的固有缺陷;而树形数据结构因其天然的分层特性与高效的检索机制,逐渐成为网络监控领域的研究热点。本文以二叉搜索树(Binary Search Tree, BST)作为研究对象,系统探讨其在公司内部网络监控场景中的应用机制,并基于 Node.js 平台构建一套具备实时更新与快速查询功能的设备状态管理算法框架。
157 3
|
JavaScript 前端开发 开发者
VUE 开发——Node.js学习(一)
VUE 开发——Node.js学习(一)
231 2
|
8月前
|
数据采集 JavaScript Android开发
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
260 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
11月前
|
JavaScript 前端开发 持续交付
构建现代Web应用:Vue.js与Node.js的完美结合
【10月更文挑战第22天】随着互联网技术的快速发展,Web应用已经成为了人们日常生活和工作的重要组成部分。前端技术和后端技术的不断创新,为Web应用的构建提供了更多可能。在本篇文章中,我们将探讨Vue.js和Node.js这两大热门技术如何完美结合,构建现代Web应用。
365 4
|
12月前
|
存储 JavaScript 前端开发
深入理解 Vuex:Vue.js 状态管理的利器
【10月更文挑战第11天】 深入理解 Vuex:Vue.js 状态管理的利器
187 2
|
12月前
|
JavaScript 前端开发 API
探索Vue.js 3的组合式API:一种更灵活的组件状态管理方式
【10月更文挑战第5天】探索Vue.js 3的组合式API:一种更灵活的组件状态管理方式
|
JavaScript 前端开发 API
Vue学习笔记3:对比纯JavaScript和Vue实现数据更新的实时视图显示
Vue学习笔记3:对比纯JavaScript和Vue实现数据更新的实时视图显示
|
11月前
|
JavaScript 前端开发 开发者
JavaScript框架React vs. Vue:一场性能与易用性的较量
JavaScript框架React vs. Vue:一场性能与易用性的较量
249 0
|
JavaScript 前端开发 UED
让 HTML 向 Vue.js 华丽转身:如何把 `wangEditor` 仿腾讯文档项目整合进 Vue.js
让 HTML 向 Vue.js 华丽转身:如何把 `wangEditor` 仿腾讯文档项目整合进 Vue.js
|
前端开发 JavaScript 开发者
Express.js与前端框架的集成:React、Vue和Angular的示例与技巧
本文介绍了如何将简洁灵活的Node.js后端框架Express.js与三大流行前端框架——React、Vue及Angular进行集成,以提升开发效率与代码可维护性。文中提供了详细的示例代码和实用技巧,展示了如何利用Express.js处理路由和静态文件服务,同时在React、Vue和Angular中构建用户界面,帮助开发者快速掌握前后端分离的开发方法,实现高效、灵活的Web应用构建。
387 3

热门文章

最新文章