DAY7 资料室--Vuex是个虾咪东东?

前言

曾几何时,你有没有对元件中资料调用感到困扰呢?
同阶层的元件资料传递,需要使用 Event Bus,确实满不好管理的。
或是相同的资料,需要在很多元件中去做变动时,变动到自己脑子都花了。
如果有一个资料库,可以统一让我们去做管理这些资料,该有多好?
就在这时候,Vuex 来了!听说他可以解决我们的问题,让我们来一起看看吧!

Vuex 状态

https://ithelp.ithome.com.tw/upload/images/20210907/20136833tZWTf3G0Op.png
此张图片取自官网,若我们可以先看懂这张图片,便能理解Vuex资料状态管理模式了。
可以看到图片中多了几个陌生的单字,是我们在Vue中没有使用过的,别担心,我们一一研究吧!

https://ithelp.ithome.com.tw/upload/images/20210907/20136833GKtIzOJv7e.jpg

我们平常使用的 VueVuex 其实有很多相似之处,毕竟是同一个生态系的,所以我做一个对照图让大家比较好联想。
Vuex 就像把 Vue 资料处理的部分单独拿出来,独立成资料处理威力加强版。

我们可以先当作有一个专门放资料的元件,叫做 store ,也可以把它当成 Event Bus plus
那在这个 store 当中,我们一样可以建立 data 放资料,建立 methods 放置方法用来处理资料,建立 computed 计算属性,只是一切都换了个名字,而且变得更严谨了一些。

state

Vue 元件的 data 有87%相像,就是拿来放资料的地方,没有错啦!
只是 Vuex 使用单一状态树,什麽意思?简单说,就是所有元件都共用这笔资料,资料都是唯一的。
如何建立 state 呢? 那我们就先来创造一个 store 看看吧!
先建立一个 store 资料夹,在其中新增 index.js 档案,我们的第一个 store 就建立完成罗!

之後我们可以开始建立资料了,像这样:

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    count: 0
  }
})

这样我们就拥有了第一笔名为 count 的资料,他目前的值为0。
那我们要怎麽修改这笔资料呢?
就需要使用 mutation 罗!

mutation

这边就是 VueVuex 比较不同的地方了,只要想更动资料,就是需要使用 mutation 里面的方法才可以唷!

export default new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment (state) {
      state.count++
    }
  }
})

像这样我们就在 mutation 里面新增了我们第一个更改资料的方法了。
increment (state) ,可以看到我们将 state 传入,便是传入我们实际要更改资料值的地方。
除了 state 之外,我们也可以传入其他参数,比如说:

// ...
mutations: {
  increment (state, n) {
    state.count += n
  }
}

像这样,就可以传入我们要增加多少数量,并透过此方法做资料的更改,而这第二个参数就叫载荷(Payload)。

如何在元件中使用 store 资料呢?

刚刚我们有了第一笔资料,也拥有了一个更动资料的方法,那我们到底要怎麽在元件中使用呢?
首先我们必须在 main.js 启用 Vuex,并 import 我们刚刚创立的 store

import Vue from 'vue'
import Vuex from 'vuex'
import store from './store'

告诉 Vue,我们要使用这个 store 的资料

new Vue({
  el: '#app',
  store: store,
})

我们可以在 computed 使用 this.$store.state 用以取得放在 store.state 的资料

computed: {
    count () {
      return this.$store.state.count
    }

也可以透过 commit 使用我们刚刚设定在 mutations 的方法,修改 state 资料

methods: {
  increment() {
    this.$store.commit('increment')
  }
}

以上是简单的 Vuex 入门,让我们先大概理解 StateMutation 是做什麽的
只是以上的范例,也并不完全是正确用法,我们可以发现目前的使用配置并不符合官方提供的 Vuex 状态图片
Vue 的元件应该透过 Action 去修改 Store 的资料,而不是直接使用 commit()
那到底要怎麽做呢?明天我们继续研究!


<<:  Raspberry pi 4b 到手

>>:  Day 7:CSS的display

大共享时代系列_022_Twitch Plays (衆人同时用弹幕控制一个游戏角色)

同心协力操作一个游戏角色,怎麽那麽难?ヽ(≧Д≦)ノ 你都怎麽玩电玩呢? 独自玩闯关、模拟类游戏? ...

第十三天:初探 Gradle Build Script

对於一个 Gradle 专案来说,一切设定与运作的核心都纪录在 Build Script 里。为了让...

【day12】InvitationDetailFragment

今天我们要做的是邀约详细资讯! 继昨天我们完成Recyclerview之後,我们今天要让我们使用者...

G Suite 教育版更名为 Google Workspace for Education,并取消无限制储存空间限制至 100 TB

先前 Google 取消无限制文件云端空间与无限制相簿空间後,大家哀鸿遍野。而原本不受影响的 GSu...

Day 05:AngularJS?Angular?傻傻分不清楚?

Angular 是由 Google 主导,开源的 JavaScript 应用程序框架,目前稳定版本已...