第四章-Actions&Getters(自用)

Actions&Getters

Actions

Pinia的Actions类似于methods,在Actions中可以写同步和异步函数,可以修改state中的状态,并且函数之间是可以相互去调用的。

同步函数

store/modules/user.js

import { defineStore } from 'pinia'




import { StoreNames } from '../namespaced.d'




import { store } from '../index'









export const useUserStore = defineStore(StoreNames.USER, {


  // 定义全局共享状态的一个初始化状态


  state: () => ({


    username: '张三',
    age: 20,
    gender: '男',
  }),
  // actions类似于methods,可以有同步和异步方法,修改state中的状态
  actions: {
    // 同步方法
    setUserName() {
      this.username = '李四'
    },
  }
})

// 方便在 setup() 外部使用 store
// 如果你需要在其他地方使用 store,你需要将原本被传递给应用 的 pinia 实例传递给 useStore() 函数
export function useUserStoreHook() {
  return useUserStore(store)
}

App.vue

<template>




  <div>




    <div>{{ username }}
    </div>

    <button @click="change">change</button>


  </div>



</template>







<script setup lang='ts'>



import { useUserStore } from '@/store/modules/user'



import { storeToRefs } from 'pinia'







const userStore = useUserStore()







const { username } = storeToRefs(userStore)



const change = () => {


  userStore.username()
}


</script>





<style lang='scss' scoped></style>



异步函数

actions中的异步函数使用async/await进行修饰的

store/modules/user.js

import { defineStore } from 'pinia'




import { StoreNames } from '../namespaced.d'




import { store } from '../index'









// 用户信息的接口类型

interface User {

  username: string

  age: number

  gender: string

}

// 请求返回的数据

let userInfo: User = {

  username: '张三',

  age: 18,

  gender: '男'

}

// 模拟登录请求

function login(): Promise<User> {

  return new Promise((resolve) => {

    setTimeout(() => {

      resolve(userInfo)

    }, 2000)

  })

}



export const useUserStore = defineStore(StoreNames.USER, {

  // 定义全局共享状态的一个初始化状态

  state: () => ({

    user: {} as User
  }),
  // actions类似于methods,可以有同步和异步方法,修改state中的状态
  actions: {
    // 异步方法,登录并修改user用户信息
    async setUser() {
      this.user = await login()
    }
  }
})

// 方便在 setup() 外部使用 store
// 如果你需要在其他地方使用 store,你需要将原本被传递给应用 的 pinia 实例传递给 useStore() 函数
export function useUserStoreHook() {
  return useUserStore(store)
}

App.vue

<template>




  <div>




    <div>{{ user }}
    </div>

    <button @click="change">change</button>


  </div>



</template>







<script setup lang='ts'>



import { useUserStore } from '@/store/modules/user'



import { storeToRefs } from 'pinia'







const userStore = useUserStore()







const { user } = storeToRefs(userStore)



const change = () => {


  userStore.setUser()

}


</script>





<style lang='scss' scoped></style>


互相调用

store/modules/user.js

import { defineStore } from 'pinia'




import { StoreNames } from '../namespaced.d'




import { store } from '../index'









// 用户信息的接口类型

interface User {

  username: string

  age: number

  gender: string

}

// 请求返回的数据

let userInfo: User = {

  username: '张三',

  age: 18,

  gender: '男'

}

// 模拟登录请求

function login(): Promise<User> {

  return new Promise((resolve) => {

    setTimeout(() => {

      resolve(userInfo)

    }, 2000)

  })

}



export const useUserStore = defineStore(StoreNames.USER, {

  // 定义全局共享状态的一个初始化状态

  state: () => ({

    like: '',
    user: {} as User
  }),
  // getters类似于computed计算属性,也具有缓存作用,用来修饰一些需要通过逻辑计算的值
  getters: {},
  // actions类似于methods,可以有同步和异步方法,也可以修改state中的状态
  actions: {
    setUserName() {
      this.like = 'jk'
    },
    // 异步方法,登录并修改user用户信息
    async setUser() {
      this.user = await login()
      // 调用setUserName
      this.setUserName()
    }
  }
})

// 方便在 setup() 外部使用 store
// 如果你需要在其他地方使用 store,你需要将原本被传递给应用 的 pinia 实例传递给 useStore() 函数
export function useUserStoreHook() {
  return useUserStore(store)
}

App.vue

<template>




  <div>




    <div>{{ user }}</div>
    <div>{{ like }}</div>
    <button @click="change">change</button>


  </div>



</template>







<script setup lang='ts'>



import { useUserStore } from '@/store/modules/user'



import { storeToRefs } from 'pinia'







const userStore = useUserStore()







const { user, like } = storeToRefs(userStore)



const change = () => {


  userStore.setUser()

}


</script>





<style lang='scss' scoped></style>


Getters

getters类似于computed计算属性,,也具有缓存作用,用来修饰一些需要通过逻辑计算的值,getters之间也可以相互使用。

两种使用方式:

getters: {

    newLike: state => `${state.like}-嗨丝`
}

或:

getters: {

    newLike () {
        return `${this.like}-嗨丝`
    }
}

store/modules/user.js

import { defineStore } from 'pinia'




import { StoreNames } from '../namespaced.d'




import { store } from '../index'









export const useUserStore = defineStore(StoreNames.USER, {


  // 定义全局共享状态的一个初始化状态


  state: () => ({


    like: 'jk'
  }),

  // getters类似于computed计算属性,也具有缓存作用,用来修饰一些需要通过逻辑计算的值

  getters: {

    newLike: state => `${state.like}-嗨丝`
  }
})


// 方便在 setup() 外部使用 store
// 如果你需要在其他地方使用 store,你需要将原本被传递给应用 的 pinia 实例传递给 useStore() 函数
export function useUserStoreHook() {
  return useUserStore(store)
}

App.vue

<template>




  <div>




    <div>{{ like }}</div>

    <div>{{ newLike }}</div>

  </div>
</template>

<script setup lang='ts'>
import { useUserStore } from '@/store/modules/user'
import { storeToRefs } from 'pinia'

const userStore = useUserStore()

const { like, newLike } = storeToRefs(userStore)


</script>



<style lang='scss' scoped></style>

互相使用

store/modules/user.js

import { defineStore } from 'pinia'




import { StoreNames } from '../namespaced.d'




import { store } from '../index'









export const useUserStore = defineStore(StoreNames.USER, {


  // 定义全局共享状态的一个初始化状态


  state: () => ({


    like: ''
  }),

  // getters类似于computed计算属性,也具有缓存作用,用来修饰一些需要通过逻辑计算的值

  getters: {

    newLike(): string {
      return `${this.like}-'嗨丝'-${this.likeType}`
    },
    likeType: () => '红底高跟鞋'
  },
})

// 方便在 setup() 外部使用 store
// 如果你需要在其他地方使用 store,你需要将原本被传递给应用 的 pinia 实例传递给 useStore() 函数
export function useUserStoreHook() {
  return useUserStore(store)
}

App.vue

<template>




  <div>




    <div>{{ like }}</div>

    <div>{{ newLike }}</div>

    <div>{{ likeType }}</div>
  </div>



</template>







<script setup lang='ts'>



import { useUserStore } from '@/store/modules/user'



import { storeToRefs } from 'pinia'







const userStore = useUserStore()







const { like, newLike, likeType } = storeToRefs(userStore)
</script>



<style lang='scss' scoped></style>

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYGJ0TGs' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片