一起学习Vue3-pinia

图片

一起学习pinia!

— 前提准备 — 

1 项目根目录下载安装pinia

npm i pinia

2 准备一个vue页面,如a.vue

<template>
  <!-- 这是一个空的vue文件 等会用于测试pinia管理的公共数据 -->
</template>

<script setup>
  
</script>

<style>
  
</style>

3 在main.js引入和使用pinia,并存入一个数据

3-1:mian.js中加入下面代码

// 1.引入pinia
import { createPinia } from 'pinia'
let app = createApp(App);

// 2.创建pinia 注意这个写在app创建之后
const pinia = createPinia()

// 3.使用pinia
app.use(pinia)

3-2:在src下面新建一个store的文件夹,里面新建一个count.js,意思是专门管理计算相关的数据,也就是说store下可以有多个数据管理的js文件

图片

3-3:count.js中写入如下代码,这是官方规定的写法

// 引入pinia的实际操作者(不知道咋说这个,我自己起的名哈哈)
import { defineStore } from "pinia"

// const xxx defineStore ('name-文件名保持一致',{})
export const useCountStore = defineStore('count', {
// 注意 这里state必须是一个函数 和vuex不一样
    state() {
      return {
        count: 0, // 组件要使用的公共数据
      }
    }
})

— 读取值 —

在a.vue中写入如下代码

<template>
   <h1>{{ countStore.count }}</h1>
</template>

<script setup>
  // 在要使用公共数据的组件中 引入store中的导出的方法 即useCountStore
  // useCountStore方法最终是返回了一个值 这个值就是state下面count
  import { useCountStore } from "../store/count.ts"

  // 所以可以直接调用useCountStore这个方法 就可以拿到count的值
  let countStore = useCountStore()
  console.log(countStore.count,"从store中获取的count值")
</script>

<style scoped>
  h1{
    text-align: center;
    margin-top: 50px;
  }
</style>

到这里,组件中读取pinia管理的数据就ok了。下面来看如何修改数据...

— 修改值 —

1 在页面中修改或操作pinia里的数据

方法1-直接修改:

pinia的数据修改可以直接写个方法用前面拿到的值来修改

// 定义一个方法 用来修改count的值
// 可以直接通过前面获取到的countStore.count来修改count的值
  function addFun(){
    countStore.count += 1
  }

所以a.vue中代码添加为下面代码:

<template>

   <h1>{{ countStore.count }}</h1>

   <button @click="addFun">加1</button>

</template>

<script setup>

  // 在要使用公共数据的组件中 引入store中的导出的方法 即useCountStore
  // useCountStore方法最终是返回了一个值 这个值就是state下面count
  import { useCountStore } from "../store/count.ts"

  // 所以可以直接调用useCountStore这个方法 就可以拿到count的值
  let countStore = useCountStore()
  console.log(countStore.count,"从store中获取的count值")

  // 定义一个方法 用来修改count的值
  // 可以直接通过前面获取到的countStore.count来修改count的值
  function addFun(){
    countStore.count += 1
  }

</script>

<style scoped>
  h1{
    text-align: center;
    margin-top: 50px;
  }

  button{
    display: block;
    margin: 10px auto;
    width: 60px;
  }
</style>

此时点击按钮即可实现数据加的效果,且数据是响应式的。

方法2-使用$patch:

有时候会遇到需要修改大量的数据,这时候按照上面的方法一个一个去修改就显得不太好了,所以pinia提供一个使用$patch对象的形式去修改的方法

即把修改方法改为如下:

function addFun(){
    // countStore.count += 1

    // 使用对象形式修改数据
    // 注意:这里修改的值 不会立即更新到页面中 需要使用$patch方法
    countStore.$patch({
      count: countStore.count + 1,
      count2: countStore.count + 10,
      count3: countStore.count * 20,
      // 其他需要修改的值
    })
  }

方法3-使用actions:

count.js代码如下,添加了actions部分

// 引入pinia的实际操作者(不知道咋说这个,我自己起的名哈哈)
import { defineStore } from "pinia"

// const xxx defineStore ('name-文件名保持一致',{})
export const useCountStore = defineStore('count', {
// 注意 这里state必须是一个函数 和vuex不一样
    state() {
      return {
        count: 0, // 组件要使用的公共数据
      }
    },

    actions: {
      // 组件要使用的公共方法
      addCount(val){
        console.log('addCount公共方法被调用')
        this.count += val
      }
    }
})

a.vue中代码如下,修改了addFun方法

<template>

   <h1>{{ countStore.count }}</h1>

   <button @click="addFun">加</button>

</template>

<script setup>

  // 在要使用公共数据的组件中 引入store中的导出的方法 即useCountStore
  // useCountStore方法最终是返回了一个值 这个值就是state下面count
  import { useCountStore } from "../store/count.ts"

  // 所以可以直接调用useCountStore这个方法 就可以拿到count的值
  let countStore = useCountStore()
  console.log(countStore.count,"从store中获取的count值")

  function addFun(){
  // actions中定义的方法来操作修改count数据 countStore.方法名(传参)
    countStore.addCount(10)
  }
</script>

<style scoped>
  h1{
    text-align: center;
    margin-top: 50px;
  }

  button{
    display: block;
    margin: 10px auto;
    width: 60px;
  }
</style>

— 加工值 —

1 getters修饰加工pinia数据

count.js中添加getters部分

// 引入pinia的实际操作者(不知道咋说这个,我自己起的名哈哈)
import { defineStore } from "pinia"

// const xxx defineStore ('name-文件名保持一致',{})
export const useCountStore = defineStore('count', {
// 注意 这里state必须是一个函数 和vuex不一样
    state() {
      return {
        count: 1, // 组件要使用的公共数据
       }
    },

    getters:{
      // 对state的数据进行处理 返回处理后的数据
      // 必须return一个值 这个ProcessedCount值可以直接在组件中使用
      ProcessedCount(){
        return this.count * 100
      }
    }
})

a.vue中可以直接使用getters处理后的数据

<template>

   <h1>{{ countStore.count }}</h1>

   <button @click="addFun">加</button>

   <h2>getters处理的数据:{{countStore.ProcessedCount}}</h2>

</template>

— 监听值 —

 

1 监听pinia的数据变化$subscribe

每一个store实例都有$subscribe这个方法,state的数据一发生改变,此函数就会执行

// 监听count值的变化
  countStore.$subscribe((mutation, state) => {
    console.log('count值的变化了', mutation, state)
  })

图片

— 读值写法简化 —

 

storeTorefs简化读取值的写法

由于现在的模板读取store值的写法都是countStore.xxxx这样的写法,导致每次读值都需要写countStore.这个东西,storeTorefs即可简化省去这个它。

<template>

  <!-- storeToRefs后的直接写 不用再countStore.xxx-->
  <h1>{{ count }}</h1>

</template>

<script setup>

  import { useCountStore } from "../store/count.ts"

  // 引入pinia的storeToRefs方法
  import {storeToRefs} from "pinia"

  let countStore = useCountStore()

  // 其实storeToRefs方法就是类似解构
  let {count} = storeToRefs(countStore)
  console.log(count, "解构后就直接在模板写count即可")

</script> 

 本文首发于公众号【雪天前端】,欢迎关注!!

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue Pinia 是一个基于 Vue 3 的状态管理库,可以让你更方便地管理应用程序的状态。下面是一个简单的例子,展示如何使用 Vue Pinia: 1. 安装 Vue Pinia ```bash npm install @pinia/vue3 ``` 2. 创建一个 store ```javascript import { defineStore } from '@pinia/vue3' export const useCounterStore = defineStore({ id: 'counter', state: () => ({ count: 0 }), actions: { increment() { this.count++ } } }) ``` 上面的代码创建了一个名为 `useCounterStore` 的 store,用于管理一个名为 `count` 的状态,并且提供了一个名为 `increment` 的 action,用于增加 `count` 的值。 3. 在组件中使用 store ```vue <template> <div> <p>Count: {{ count }}</p> <button @click="increment">Increment</button> </div> </template> <script> import { useCounterStore } from './store' export default { setup() { const counterStore = useCounterStore() return { count: counterStore.count, increment: counterStore.increment } } } </script> ``` 在组件中使用 `useCounterStore`,并且将 `count` 和 `increment` 绑定到组件的模板中。 4. 在应用程序中注册 store ```javascript import { createApp } from 'vue' import App from './App.vue' import { createPinia } from '@pinia/vue3' import { useCounterStore } from './store' const app = createApp(App) const pinia = createPinia() pinia.useStore(useCounterStore) app.use(pinia) app.mount('#app') ``` 在应用程序中注册 `useCounterStore`,并将其添加到 `pinia` 实例中。 以上就是使用 Vue Pinia 的一些基本步骤。通过使用 Vue Pinia,你可以轻松地管理应用程序的状态,提高开发效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值