[pinia快速入门]2.使用action修改state的值

我们把数据存放在state中,如果修改它的话,就要使用pinia中另外一个重要的概念actions了。
如果与Vuex对比,pinia中的action相当于Vuex中mutation和action的总和。
在pinia的action中既可以处理同步修改,也可以处理异步。简化了Vuex中修改状态的概念。

同步修改

我们先来写一个同步修改的例子,
比如我们现在除了保存了用户名,还保存了用户的手机号码,然后增加一个修改手机号码的方法,这时就需要定义一个action了。
pinia官网也说明了,actions就相当于vue中methods,定义的时候也非常像:

import { defineStore } from 'pinia'
export const useProfileStore = defineStore('profile', {
  state() {
    return {
      userName: '林哥',
      phone: 18888888888,
    }
  },
  actions: {  // 和vue中的methods一样
    updatePhone(newPhone) {
      this.phone = newPhone // 可以使用this访问和修改state中的数据
    },
  },
})

我们在actions中定义了一个更新手机号的方法,它接受一个参数,把它设置为新的手机号
然后我们就可以在App.vue中调用这个方法了:

<template>
  <div>用户名是: {{ profileStore.userName }}</div>
  <div>手机号是: {{ profileStore.phone }}</div>
</template>

<script setup>
import { onMounted } from 'vue'
import { useProfileStore } from './store/profileStore'
const profileStore = useProfileStore()
onMounted(() => {
  profileStore.updatePhone(19999999999)  // 在页面挂载后,修改手机号
})
</script>

使用store的实例就可以直接调用store中定义的action,这我们调用updatePhone方法,修改了手机号,
刷新页面,这时页面上显示:

用户名是: 林哥
手机号是: 19999999999

异步修改

首先我们写一个模拟请求后台接口,
在src文件夹下建立一个api文件,然后在里面新建一个login.js的文件,它的内容是:

export function loginApi(userName, password) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if ((userName === '林哥') & (password === '9527')) {
        resolve({
          userName: '林哥',
          phone: 18888888888,
          avatar: 'avatar.jpg',
        })
      } else {
        reject('用户名或密码错误')
      }
    }, 1000)
  })
}

然后我们修改profileStore的内容,在state中新增了avatar头像这个属性,这些数据默认都是空,
在actions中新增了login,用于去调用异步的请求loginApi:

import { defineStore } from 'pinia'
import { loginApi } from '../api/login' // 新增
export const useProfileStore = defineStore('profile', {
  state() {
    return {
      userName: '',
      phone: '',
      avatar: '', // 新增
    }
  },
  actions: {
    login(userName, password) { // 新增
      loginApi(userName, password)
        .then((res) => { // 登录成功以后,修改了用户名
          this.userName = res.userName
        })
        .catch((err) => {
          console.log(err)
        })
    },
  },
})

最后我们在App.vue中调用login这个action:

<template>
  <div>用户名是: {{ profileStore.userName }}</div>
  <div>手机号是: {{ profileStore.phone }}</div>
</template>

<script setup>
import { onMounted } from 'vue'
import { useProfileStore } from './store/profileStore'
const profileStore = useProfileStore()
onMounted(() => {
  profileStore.login('林哥', '9527') // 新增
})
</script>

页面上最终显示:

用户名是: 林哥
手机号是:

异步修改state并没有什么特殊,只是多调用了一个异步方法,修改时还是使用this就行了。这就比Vuex中方便不少。

使用$patch同时修改多个值

我们现在只更新了userName的值,我们还有phone和avatar两个值,可以这么写

this.userName = res.userName
this.phone = res.phone
this.avatar = res.avatar

也可以使用$patch方法,一次修改多个值:

this.$patch({
  userName: res.userName,
  phone: res.phone,
  avatar: res.avatar,
})

页面上显示:

用户名是: 林哥
手机号是: 18888888888

这节课就到这里了,总结一下:
1)使用actions同步或者异步修改state
2)使用$patch可以一次修改多个值

ps:虽然pinia支持不通过action,直接修改state的值,但是我觉着统一在action中修改比较规范、合理。我看github上的讨论大部分人也都倾向不能随便state的值。所以这里只给大家介绍了在action中修改state的方式。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容