1.store文件夹的index.js文件下操作vuex分模块管理导入

# 1.store文件夹的index.js文件下操作vuex分模块管理导入

import { createStore } from 'vuex'
import appStore from './appStore'

export default createStore({
  modules: {
    appStore
  }
})

1
2
3
4
5
6
7
8
9

# 2.store/appStore.js文件创建存取需求的操作方法

const appStore = {
    state: {
        totle: 10
    },
    mutations: {
        totleFun(state, value) {
            state.totle = value
        }
    },
    actions: {
        totleFunAdd(context, value) {
            context.commit('totleFun', value + 1)
        },
        totleFunDel(context, value) {
            context.commit('totleFun', value - 1)
        }
    }
}

export default appStore;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 3.views/app.js文件下渲染、存取操作

<template>
  <div class="app">{{store.state.appStore.totle}}</h1>
    <button @click="add">+值</button> <button @click="del">-值</button>
  </div>
</template>

<script>
import { useStore } from 'vuex';

export default {
	setup() {
		const store = useStore();
		const add = () => {
      		store.dispatch('aFunAdd', store.state.appStore.totle)
    	}
    	const del = () => {
      		store.dispatch('aFunDel', store.state.appStore.totle)
    	}
    	return {
    		add,
    		del,
    		store
    	}
	}
}
</script>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

Vue3 中的Vuex不再提供辅助函数写法

# 4. 更适合vue3的状态库 “Pinia”

*全面拥抱 Pinia 吧! 2021年11月24日,尤大在 Twitter 上宣布:Pinia 正式成为 Vue 官方的状态库,意味着 Pinia 就是 Vuex 5Pinia 的优点:

  • 同时支持 Composition Api 和 Options api 的语法;
  • 去掉 mutations ,只有 state 、getters 和 actions ;
  • 不支持嵌套的模块,通过组合 store 来代替;
  • 更完善的 Typescript 支持;
  • 清晰、显式的代码拆分;

# 安装

使用 npm
npm install pinia

使用 yarn
yarn add pinia

1
2
3
4
5
6

# main.js 引入

import App from './App.vue'
import { createApp } from 'vue'
import { createPinia } from 'pinia'

const app = createApp(App)
app.use(createPinia())
app.mount('#app')

1
2
3
4
5
6
7
8

# 配置 store.js

import { defineStore } from 'pinia'

// defineStore 调用后返回一个函数,调用该函数获得 Store 实体
export const useStore = defineStore({
  // id: 必须,在所有 Store 中唯一
  id: 'globalState',
  // state: 返回对象的函数
  state: () => ({
    count: 1,
    data: {
      name: 'Jerry',
      sex: '男'
    }
  }),
  // getter 第一个参数是 state,是当前的状态,也可以使用 this 获取状态
  // getter 中也可以访问其他的 getter,或者是其他的 Store
  getters: {
    // 通过 state 获取状态
    doubleCount: (state) => state.count * 2,
    // 通过 this 获取状态(注意this指向)
    tripleCount() {
      return this.count * 3
    }
  },
  actions: {
    updateData (newData, count) {
      // 使用 this 直接修改
      this.data = { ...newData }
      this.count = count
      
      // 使用 $patch 修改多个值
      this.$patch({
        data: { ...newData },
        count
      })
    }
  }
})

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

# 使用 store

<template>
  // 获取 store 的 state
  <p>姓名:{{store.data.name}}</p>
  <p>性别:{{store.data.sex}}</p>
  
  // 调用 mutations 方法 / 修改 store
  <button @click='update'>修改用户信息</button>
  
  // 获取 getter
  <p>获取getter:{{store.doubleCount}}</p>
</template>

<script setup>
  import { useStore } from '@store/store.js'
  const store = useStore()
  
  function update () {
    // 通过 mutations 定义的方法修改 state
    store.updateData({ name: 'Tom', sex: '女' })
    
    // 通过 store 直接修改
    store.data = { name: 'Tom', sex: '女' }
    
    // 同时改变多个状态
    store.$patch((state) => {
      state.data = { name: 'Tom', sex: '女' }
      state.count = 2
    })
  }
</script>

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

# 其他方法

替换整个 state $state 可以让你通过将 store 的属性设置为新对象来替换 store 的整个 state

const store = useStore()
store.$state = {
  name: 'Bob',
  sex: '男'
}

1
2
3
4
5
6

重置状态 调用 store 上的 $reset() 方法将状态重置为初始值

const store = useStore()
store.$reset()
1
2
最后更新于: 2022/3/25 07:58:56
강남역 4번 출구
Plastic / Fallin` Dild