Vue 3 & Pinia 状态管理(4) - Pinia Getters 的相关使用

作者: 温新

分类: 【Vue.js】

阅读: 1617

时间: 2023-07-22 10:09:44

嗨,我是温新,一名 PHPer。

本篇目标:了解什么是 Pinia

Pinia 官方文档:https://pinia.web3doc.top/introduction.html

本篇文章属于 pinia 小系列,因此,文件之间存在关联,若遇到不连贯的地方,请查看该系列文章。如本篇文章中有一个 child 组件,但是本篇文章没有对它进行编写。

Getters

官方解释:Getter 完全等同于 Store 状态的 计算值

说人话,把它当做计算属性来看待和操作。

getter 使用 defineStore() 中的 getters 属性来定义。

添加 getter

// src/stores/user.ts

import { defineStore } from 'pinia'
import {ref, computed} from 'vue'

export default defineStore('user', () => {
    const name = ref('自如初')
    const url = ref('https:/www.ziruchu.com')
    const age = ref(4)

	// 组合式 API 中,使用 计算属性来定义 getter
    const computedName = computed( () => {
    	return "我叫 " + name.value + ", 今年 " + age.value + ' 岁了';
    })

    return {name, url, age, computedName}
})

使用 getter

<template>
	<h3>信息:{{ userStore.computedName }}</h3>
</template>

使用的时候直接从仓库中取出该值就行了,也可以从仓库中解构出来直接使用。

getter 中使用其他的 getter

步骤一:仓库中添加 getter

// src/stores/user.ts

// 定义 getter
const computedName = computed( () => {
	return "我叫 " + name.value + ", 今年 " + age.value + ' 岁了 ';
})

// getter 中使用 gtter
const computedAge = computed(() => {
	return computedName.value + (age.value >= 18 ? '成年': '未成年')
})

步骤二:模板中使用

<!-- src/App.vue -->

<input type="number" v-model="age">
<h3>信息:{{ userStore.computedName }}</h3>
<h3>成年与否:{{  userStore.computedAge }}</h3>

getter 中传参

步骤一:仓库库添加 gtter

// src/stores/user.ts

// getter 中的参数
const getAge = computed(() => {
	return (num: number) =>  age.value + num
})

步骤二:模板中使用

<!-- src/App.vue -->

<h3>getter 中传递参数:{{ userStore.getAge(19) }}</h3>

完整代码

// src/stores/user.ts

import { defineStore } from 'pinia'
import {ref, computed} from 'vue'

// 组合式 API
export default defineStore('user', () => {
  const name = ref('自如初')
  const url = ref('https:/www.ziruchu.com')
  const age = ref(4)

  // 定义 getter
  const computedName = computed( () => {
    return "我叫 " + name.value + ", 今年 " + age.value + ' 岁了 ';
  })

  // getter 中使用 gtter
  const computedAge = computed(() => {
    return computedName.value + (age.value >= 18 ? '成年': '未成年')
  })

  // getter 中的参数
  const getAge = computed(() => {
    return (num:number) =>  age.value + num
  })

  return {name, url, age, computedName, computedAge, getAge}
})
<!-- src/App.vue -->

<template>
  <div>
    <h2>名称:{{ name }}</h2>
    <h2>网址:{{ url }}</h2>
    <h2>年龄:{{ age }}</h2>
    <input type="number" v-model="age">
    <button @click="changeName">修改名称</button>
    <button @click="changePatchStore">批量修改数据</button>
    <button @click="handleReset">重置</button>
   
    <h3>信息:{{ userStore.computedName }}</h3>
    <h3>getter 调用 getter:{{  userStore.computedAge }}</h3>
   
    <h3>getter 中传递参数:{{ userStore.getAge(19) }}</h3>
   
    <hr>
   <child></child>
  </div>
</template>

<script setup lang="ts">
  import { toRefs } from 'vue'
  import useUserStore from './stores/user'
  import child from './home/child.vue'

  const userStore = useUserStore()
  const {name, url, age,} = toRefs(userStore)

  const changeName = () => {
    userStore.name = '计算机导论'
  }

  // 批量修改
  const changePatchStore = () => {
    // userStore.$state = {name:"算法导论", age:19, url:"www.ziruchu.com"}
    userStore.$patch({name:"计算机科学导论"})
  }

  // 重置
  const handleReset = () => {
    userStore.$reset()
  }
</script>

选项式 API 和组合式 API 的使用方式有所不同,大家可以试试,下面是选项式 API代码:

// str/stores/common.ts

import { defineStore } from "pinia";

export default defineStore('common', {
    state: () => {
        return {
            name: '王美丽',
            age: 19
        }
    },
    getters: {
        getName: (state) => state.name = '郝帅'
    }
})

模板中引入使用

{{  commonStore.getName }}

<script setup lang="ts">
  import useCommonStore from './stores/common'
  const commonStore = useCommonStore()
</script>
请登录后再评论