5、Vue 3 Pinia 使用实录:Getter

作者: 温新

图书: 【Vue 3 Pinia 使用实录】

阅读: 295

时间: 2024-11-21 13:12:02

嗨,我是温新

getterPinia 中的一个重要概念,简单地讲,它类似 Vue 3 中的计算属性。

在 Setup 中,Getter 性质如下:

  • ref()state 属性
  • computed()getters
  • function ()actions

Getter 基本使用

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

1、定义 getter

src/stores/user.ts

import { defineStore } from "pinia";
import { computed, ref } from "vue";

const useUserStore = defineStore('user', () => {
  
    const username = ref("王美丽")
    const age = ref(18)

    const updateUsername = (uname:string) => {
        username.value = uname
    }

    const updateAge = (uage:number) => {
        age.value = uage
    }

    // 定义 getter
    const newUsername = computed(() => {
        return '我是 ' + username.value + ', 我 ' + age.value + '岁了'
    })

    return {
        username,
        age,
        updateUsername,
        updateAge,
        newUsername
    }
})


export default useUserStore
2、使用 getter

src/App.vue

<template>
  <h3>Vue 3 Pinia 使用实录</h3>
  <div class="main">
      <h3>{{ username }}</h3>
      <h3>{{ age }}</h3>
	  <h3>{{ newUsername }}</h3>
      <button @click="updateByUsername">修改名称</button>
      <button @click="updateUserage">修改年龄</button>
  </div>
  
</template>

<script setup lang="ts">
	import  useUserStore  from "@/stores/user.ts";
	import { storeToRefs } from 'pinia'

	const userStore = useUserStore()
	// 解构出 newUsername
	const { username, age, newUsername } = storeToRefs(userStore)
	const { updateUsername, updateAge } = userStore;
 
	const updateByUsername = () => {
		updateUsername("王丽丽")
	}
	const updateUserage = () => {
		updateAge(19)
	}
</script>

<style scoped>
.main {
  background-color: pink;
}
</style>

Getter 嵌套使用

1、修改仓库

src/stores/user.ts

import { defineStore } from "pinia";
import { computed, ref } from "vue";

const useUserStore = defineStore('user', () => {
	...

    const newUsername = computed(() => {
        return '我是 ' + username.value + ', 我 ' + age.value + '岁了'
    })

    // 嵌套使用 getter
    const newAge = computed(() => {
        return newUsername.value + (age.value >= 18 ? '成年' : '未成年')
    })

    return {
        username,
        age,
        updateUsername,
        updateAge,
        newAge
    }
})

export default useUserStore
2、使用 getter

src/App.vue

<template>
  <h3>Vue 3 Pinia 使用实录</h3>
  <div class="main">
	...
      
	<h3>{{ newAge }}</h3>
      
	...
  </div>
  
</template>

<script setup lang="ts">
	...
    
	const { username, age, newUsername,newAge } = storeToRefs(userStore)
	
    ...
</script>

...

getter 参数

1、修改仓库
import { defineStore } from "pinia";
import { computed, ref } from "vue";

const useUserStore = defineStore('user', () => {
	...

    const getUserAge = computed(() => {
        return (num:number) => age.value + num
    })


    return {
		// ...
        
        getUserAge
    }
})

export default useUserStore
2、使用 getter

src/App.vue

<template>
  <h3>Vue 3 Pinia 使用实录</h3>
  <div class="main">

      ...
      <!-- getter 参数使用 -->
	  <h2>{{  getUserAge(12) }}</h2>

      ...
  </div>
  
</template>

<script setup lang="ts">
	...
    
	const { updateUsername, updateAge, getUserAge } = userStore;
 
	...
</script>

...
请登录后再评论