pinia 的使用(四)—— getters

1、Getters

① getter 声明与使用

  1. Getter 完全等同于 Store 状态的计算属性;Getters 函数的第一个参数是 state 对象;

  2. src/store/index.ts文件中去写一个getters,来体验一下:

    import { defineStore } from 'pinia' // 导入 pinia 中的功能模块
    
    // 创建容器
    // 参数一:容器名
    // 参数二:容器的内容
    const useMainStore =  defineStore('main', {
      // pinia 状态管理的数据,通过箭头函数返回一个对象
      // 相当于 vue 中的 data 数据
      state: () => {
        return {
          message1: 'Hello',
          message2: 'Pinia',
          count: 1,
          number: 666
        }
      },
    
      // 相当于 vue 中的 computed 计算属性
      getters: {
        // 定义的 getters,第一个参数就是该容器的 state
        comp(state) {
          return ++state.count
        }
      },
    
      // 相当于 vue 中的 methods 方法
      actions: {
        // 1、count 加法方法
        addCount() {
          this.count++
        }
      }
    })
    
    // 导出容器
    export {
      useMainStore
    }
    
  3. 在页面组件中可以直接去调用该容器的getters方法:

    <template>
      <!-- 后面相同的调用,都是基于第一次计算的值 -->
      <p>{{ mainStore.comp }}</p>
      <p>{{ mainStore.comp }}</p>
      <p>{{ mainStore.comp }}</p>
    </template>
    
    <script setup lang="ts">
    // 导入 pinia 实例
    import { useMainStore } from '../store/index'
    
    // 实例化容器
    const mainStore = useMainStore()
    </script>
    
    <style scoped></style>
    
    
  4. 可以查看页面效果,只会调用该getters一次,和计算属性一样,都存在缓存:
    在这里插入图片描述

② 将参数传递给 getters (回调函数)

  1. Getter 只是幕后的计算属性,因此无法向它们传递任何参数。但是,您可以从 getter 返回一个函数来接受任何参数,请注意,执行此操作时,getter 不再缓存,它们只是您调用的函数。但是,您可以在 getter 本身内部缓存一些结果,这并不常见,但性能更高:

    import { defineStore } from 'pinia' // 导入 pinia 中的功能模块
    
    // 创建容器
    // 参数一:容器名
    // 参数二:容器的内容
    const useMainStore =  defineStore('main', {
      // pinia 状态管理的数据,通过箭头函数返回一个对象
      // 相当于 vue 中的 data 数据
      state: () => {
        return {
          message1: 'Hello',
          message2: 'Pinia',
          count: 1,
          number: 666
        }
      },
    
      // 相当于 vue 中的 computed 计算属性
      getters: {
        // 定义的 getters,第一个参数就是该容器的 state
        comp(state) {
          return (num: number) => {
            return state.count + num
          }
        }
      },
    
      // 相当于 vue 中的 methods 方法
      actions: {
        // 1、count 加法方法
        addCount() {
          this.count++
        }
      }
    })
    
    // 导出容器
    export {
      useMainStore
    }
    
  2. 然后在组件中使用它们:

    <template>
      <!-- 后面相同的调用,都是基于第一次计算的值 -->
      <p>{{ mainStore.comp(2) }}</p>
      <p>{{ mainStore.comp(3) }}</p>
      <p>{{ mainStore.comp(4) }}</p>
    </template>
    
    <script setup lang="ts">
    // 导入 pinia 实例
    import { useMainStore } from '../store/index'
    
    // 实例化容器
    const mainStore = useMainStore()
    </script>
    
    <style scoped></style>
    
  3. 可以查看页面的效果:

    在这里插入图片描述

注意: 如果给getters传参,返回的函数不会被缓存

③ getter中的this

  1. getter中同样可以使用 this,但是 TS 无法推导类型,需要手动指定返回值类型:

    // 类似于组件的computed,用来封装计算属性,有缓存的功能
    getters: {
      // 传入 state [可选参数]
      // computeds(state){
      //   console.log('getter运行了')
      //   return state.count + 1
      // }
    
      // !getter 中同样可以使用 this ,但是 TS 无法推导类型,需要手动指定返回值类型
      computeds():number {
        console.log('getter运行了')
        return this.count + 1
      }
    },
    

④ 访问其它getters

  1. 与计算属性一样,您可以组合多个 getter。通过此访问任何其他 getter:

    getters: {
      computeds():number{
        console.log('getter运行了')
        return this.count+2
      },
    
      double():number{
        this.foo = this.computeds * 2 
        return this.foo
      }
    },
    

⑤ 访问其它容器的actions 或getter

  • 直接导入并实例化容器后,使用即可,与前面的跨容器调用一致,不再展示示例代码
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Pinia中,getter函数类似于Vue的计算属性,可以进行一些计算或处理。如果需要在getter函数中传递参数,需要做一些特殊处理。一个例子如下所示: ```html <template> <div> <!-- 在页面上使用getter函数时,需要进行传参 --> 你好,我是pinia--{{ userStore.getAddAge(100) }} <button @click="add">1</button> </div> </template> ``` 在上面的代码片段中,我们可以看到在页面上使用getter函数时,我们可以通过传递参数给getter函数来实现特定的计算或处理。在这个例子中,`getAddAge`是一个getter函数,它接受一个参数100,并返回一个计算后的值。所以在页面上使用`userStore.getAddAge(100)`可以得到相应的结果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [2023 年更新,Vue3 + TS 仿知乎专栏企业级项目(升级版14章)](https://download.csdn.net/download/u011063343/87881422)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [pinia 核心模块 --- getter](https://blog.csdn.net/qq_63358859/article/details/128920657)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凉爽爽爽爽爽爽爽爽爽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值