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

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

1.pinia的简单介绍


Pinia最初是在2019年11月左右重新设计使用Composition API的 Vue 商店外观的实验。


从那时起,最初的原则相同,但 Pinia 适用于 Vue 2 和 Vue 3 。


并且不需要你使用组合 API。


除了安装和SSR之外,还有其他的 API是一样的。


并且这些针对 Vue 3 ,并在必要时提供 Vue 2 的相关注释。


以便 Vue 2 和 Vue 3 的用户可以阅读!


2.为什么要使用Pina?


Pinia 是 Vue 的存储库,


允许您跨组件/页面共享状态。


如果您的组合 API,您可能会认为您可以使用简单的export const state = reactive({})


这对于单页应用程序来说是正确的,


但如果它是服务器端的外观,将您的应用程序显示给安全漏洞。


但即使在小型单页应用程序中,您也可以从使用 Pinia 中获得好处:


1.开发工具支持


2.动作、追踪的跟踪


3.热模块更换


4.为 JS 用户提供适当功能的 TypeScript 支持或自动完成


5.服务器端渲染支持


安装


npm install pinia --save


3.创建文件夹和文件-存放数据


在新建 src/store目录并在其下面创建 index.ts文件,并导出这个文件
// src/store/index.ts下的代码
import { createPinia } from 'pinia'
const store = createPinia()
export default store


在 main.ts 中引入


import { createApp } from 'vue'
import App from './App.vue'
import router from './router/index'
<!-- 引入 -->
import store from "./store/index"
<!-- 使用store -->
createApp(App).use(router).use(store).mount('#app')


需求描述


假设我们现在有好几个模块。有user模块。admin模块。


我们想对这模块中的数据进行管理。


为了管理方便,后面易于维护。我们决定将这些模块进行拆分。


于是我们在store下创建 user.ts 文件,管理这个user模块的数据。


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'
        }
    },
})


defineStore的介绍


defineStore 接收两个参数.


第一个参数:必须是唯一的,多个模块千万千万不能重名。


因为Pinia 会把所有的模块都挂载到根容器上


第二个参数是一个对象,里面的选项state和 Vuex 差不多


4.获取store中值的第一种方法


<template>
    <div class="pinia">
       <h2> 学习pinia </h2>
       <div> {{ userStore }} </div>
        <div>姓名:{{ userStore.name }}</div>
        <div>性别:{{ userStore.sex }}</div>
        <div>工作:{{ userStore.work }}</div>
        <div>身高:{{ userStore.heigt }}</div>
    </div>
</template>
<script setup lang='ts'>
// 引入store中暴露出去的方法
import { useUserStore } from '../../store/user'
const userStore = useUserStore()
</script>


1425695-20220425171904412-201522294.png

获取store中值的第二种方法-computed


<template>
    <div class="pinia">
       <h2> 学习pinia </h2>
        <div>姓名:{{useStoreName}}</div>
        <div>性别:{{useStoreSex}}</div>
    </div>
</template>
<script setup lang='ts'>
// 引入store中暴露出去的方法
import { computed } from 'vue'
import { useUserStore } from '../../store/user'
const userStore = useUserStore()
// 使用 computed取获取值
const useStoreName = computed(() => userStore.name)
const useStoreSex = computed(() => userStore.sex)
</script>


1425695-20220425172138455-2078402542.png提出问题


如果对象上有多个属性,可以进行结构吗?


可以的!


使用 pinia 提供的 storeToRefs


我们来看下怎去使用


5.pinia 提供的 storeToRefs进行结构


<template>
    <div class="pinia">
       <h2> 学习pinia </h2>
        <div>姓名:{{ asName }}</div>
        <div>性别:{{ mysex }}</div>
        <div>工作:{{ work }}</div>
        <div>身高:{{ heigt }}</div>
    </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 } = storeToRefs(userStore)
</script>

1425695-20220425172821341-2110703111.png

6.如何修改 state 中的数据


修改 state 中的数据,可以通过 actions 下的方法。
然后调用 updataName 就可以取修改 state中的name值了
//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 可以修改state中的值,这里面提供方法
    actions:{
        // 修改name中的数据
        updataName(name:string){
            this.name=name
        },
    },
})


调用方法,修改state中的name


<template>
    <div class="pinia">
       <h2> 学习pinia </h2>
        <div>姓名:{{ asName }}</div>
        <div>性别:{{ mysex }}</div>
        <div>工作:{{ work }}</div>
        <div>身高:{{ heigt }}</div>
        <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 } = storeToRefs(userStore)
const changeHander=()=>{
    userStore.updataName('小玉兔')
    // 这样我发现也可以,但是不推荐这样使用。
    // 统一通过 actions 中的方法去修改值
    userStore.work='我换工作了'
}
</script>

1425695-20220425172400686-1352954739.gif


相关文章
|
2月前
|
JavaScript 前端开发 开发者
VUE 开发——Node.js学习(一)
VUE 开发——Node.js学习(一)
91 3
|
1月前
|
JavaScript 前端开发 持续交付
构建现代Web应用:Vue.js与Node.js的完美结合
【10月更文挑战第22天】随着互联网技术的快速发展,Web应用已经成为了人们日常生活和工作的重要组成部分。前端技术和后端技术的不断创新,为Web应用的构建提供了更多可能。在本篇文章中,我们将探讨Vue.js和Node.js这两大热门技术如何完美结合,构建现代Web应用。
41 4
|
1月前
|
JavaScript 前端开发 开发者
JavaScript框架React vs. Vue:一场性能与易用性的较量
JavaScript框架React vs. Vue:一场性能与易用性的较量
37 0
|
2月前
|
存储 JavaScript 前端开发
深入理解 Vuex:Vue.js 状态管理的利器
【10月更文挑战第11天】 深入理解 Vuex:Vue.js 状态管理的利器
53 2
|
2月前
|
JavaScript 前端开发 API
探索Vue.js 3的组合式API:一种更灵活的组件状态管理方式
【10月更文挑战第5天】探索Vue.js 3的组合式API:一种更灵活的组件状态管理方式
|
3月前
|
JavaScript 前端开发 API
Vue学习笔记3:对比纯JavaScript和Vue实现数据更新的实时视图显示
Vue学习笔记3:对比纯JavaScript和Vue实现数据更新的实时视图显示
|
2月前
|
JavaScript 前端开发 应用服务中间件
vue前端开发中,通过vue.config.js配置和nginx配置,实现多个入口文件的实现方法
vue前端开发中,通过vue.config.js配置和nginx配置,实现多个入口文件的实现方法
198 0
|
2月前
|
JavaScript
深入解析:JS与Vue中事件委托(事件代理)的高效实现方法
深入解析:JS与Vue中事件委托(事件代理)的高效实现方法
58 0
|
2月前
|
存储 缓存 JavaScript
深入探讨 Vuex:Vue.js 状态管理的最佳实践
【10月更文挑战第11天】深入探讨 Vuex:Vue.js 状态管理的最佳实践
32 0
|
2月前
|
JavaScript 前端开发
前端js,vue系统使用iframe嵌入第三方系统的父子系统的通信
前端js,vue系统使用iframe嵌入第三方系统的父子系统的通信