Vuex 入门到进阶

简介: Vuex 入门到进阶

先说一下Vuex到底是什么?

Vuex 是一个专门为 vue.js 应用程序开发的状态管理模式

  • 这个状态我们可以理解为在 data 中的属性,需要共享给其他组件使用的部分
  • 也就是说,我们需要共享的数据,可以使用 vuex 进行统一集中式的管理

喜欢看代码学习的的可直接下载下方 Demo

gitee.com/jiangliyue/…


Vuex中的五种基本对象

  • state:存储状态(变量)
  • getters:对数据获取之前的再次编译,可以理解为 state 的计算属性,我们在组件中使用 $store.getters.fun() 调用
  • mutations:修改状态,并且是同步的。在组件中使用 $store.commit('操作名',params) 调用
  • actions:异步操作。在组件中使用 $store.dispatch('操作名') 调用
  • modules:store 的子模块,为了开发大型项目,方便状态管理而使用的,使用方法和上面一样
// 常见vuex初始化配置
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
    state: {
        msg: 'hello ',
        username: ''
    },
    getters: {},
    mutations: {},
    actions: {},
    modules: {}
})
复制代码


在项目中使用 Vuex

将上面初始化的 Vuex 对象引入到 main.js 文件中

// 引入store
import store from '@/store/index'
new Vue({
    store,
    render: h => h(App)
}).$mount('#app')复制代码

在组件中使用

<template>
  <div class="hello">
    <h3>{{$store.state.msg}}</h3>
  </div>
</template>
<script>
export default {
    name: 'home',
    created() {
        console.log(this.$store.state)
    }
}
</script>复制代码

现在我们已经可以使用 Vuex 中的 state 了,接下来我们看看如何操作这个属性

Vuex 提供了 mutations 和 actions 两种方法来操作 state

mutations(同步操作)

定义 mutations 对象里的方法,方法里面的参数,第一个默认为 state,第二个为自定义传入参数。

/**
 * mutations 里面放置的是我们操作state对象属性的方法
 */
const mutations = {
    setMsg(state, name) {
        state.msg = 'hellow' + name
    }
}
export default new Vuex.Store({
    state,
    mutations
})复制代码

组件中使用 Vuex 提供的 commit 方法调用 mutations 中我们自定义的方法

created() {
    this.setSayMsg('your Name')  
},
methods: {
    setSayMsg(name) {
      this.$store.commit('setMsg',name)
    }
}复制代码

效果如何大家自行实验哈~

actions(异步操作)

定义 actions 对象里的方法,方法里面的参数,第一个是context,它是一个和 store 对象具有相同对象属性的参数,第二个为自定义传入参数。

通常当我们需要修改多个状态或者说调用多个 mutations 里的方法时会用到 actions

/**
 * actions 里面放置的是我们调用store对象的方法
 */
const actions = {
    // 常规写法
    // actionsSetMsg(context, name) {
    //    context.commit('setMsg', name)
    // }
    // 简化写法
    actionsSetMsg({ commit }, name) {
        commit('setMsg', name)
    }
}
export default new Vuex.Store({
    state,
    actions
})复制代码

组件中使用 Vuex 提供的 dispatch 方法调用 actions 中我们自定义的方法

created() {
    this.actionsSetSayMsg('your Name')  
},
methods: {
    actionsSetSayMsg(name) {
        this.$store.dispatch('actionsSetMsg',name)
    }
}复制代码

最后是 getters,我们一般使用 getters 来获取我们的 state,因为它算是 state 的一个计算属性,相当于实时监听状态变化

定义 getters 对象里的方法

const getters = {
    getMsg(state) {
        return state.msg
    }
}
export default new Vuex.Store({
    state,
    getters
})复制代码

组件中使用

computed: {
    msg() {
        return this.$store.getters.getMsg
    }
}复制代码

看到这里如果上面的用法都能理解,那恭喜你的 Vuex 已经学的很好了!

接下来的是官方提供给我们使用 Vuex 的一些小技巧

  • mapState
  • mapMutations
  • mapActions
  • mapGetters
  1. 需要明确的是,这些方法只是方便我们书写,重点还是上面的基础部分
  2. 这部分用到了 es6 的扩展运算符,不熟悉的同学自行百度吧,还是蛮有用的

用法还是看下面代码直接点,主要记住2点

  • 引入都用到扩展运算符,即3个点 '...' ,方式则为下面 2种模板任选一种
...mapState({
    你在该页面想用的变量名: '你state对象里定义的属性或方法名'
})
// 或者传入一个数组,此时当前组件调用的变量名与state中定义的方法名一致
...mapState(['你state对象里定义的属性或方法名'])复制代码
  • 另外记住 ...mapState({...}) 和 ...mapGetters({...}) 放在 computed 计算属性里, ...mapMutations({...}) 和 ...mapActions({...})放在methods 方法属性里就可以了

Demo

Git 地址

gitee.com/jiangliyue/…

<template>
    <div class="hello">
        <h1>Msg: {{ $store.state.msg }}</h1>
        <h1>Your Name: {{ username }}</h1>
        <h1>mapState Your Name: {{ mapStateName }}</h1>
        <h1>mapGetters Your Name: {{ mapGettersName }}</h1>
        <h1>User Name: <input type="text" v-model="name" /></h1>
        <h1>
            <button @click="save">保存用户名</button>
            <button @click="mapSave(name)">map 模式</button>
        </h1>
        <h1>
            <button @click="saveAndUpdate">保存用户名并更新语句</button>
            <button @click="mapSaveAndUpdate(name)">map 模式</button>
        </h1>
    </div>
</template>
<script>
import { mapState, mapMutations, mapActions, mapGetters } from 'vuex'
export default {
    name: 'HelloWorld',
    data() {
        return {
            name: ''
        }
    },
    computed: {
        username() {
            return this.$store.getters.getUserName
        },
        ...mapState({
            mapStateName: 'username'
        }),
        ...mapGetters({
            mapGettersName: 'getUserName'
        })
    },
    methods: {
        save() {
            // // 粗暴写法(不推荐,主要不利于维护)
            // this.$store.state.username = this.name
            // 同步写法 使用 commit 调用 mutations
            this.$store.commit('setUserName', this.name)
        },
        saveAndUpdate() {
            // 异步写法 使用 dispatch 调用 actions
            // 一般用于需要依次改变多个状态的流程
            this.$store.dispatch('saveAndUpdate', this.name)
        },
        // 使用 mapMutations, mapActions 来简化代码
        // 传入数组生成一个 this.setUserName(data) 的方法
        // ...mapMutations(['setUserName']),
        // 传入对象 可重新定义方法名 生成一个 this.mapSave(data) 的方法
        ...mapMutations({
            mapSave: 'setUserName'
        }),
        // 同理 actions 也可以传入数组一次性生成多个方法
        ...mapActions({
            mapSaveAndUpdate: 'saveAndUpdate'
        })
    }
}
</script>复制代码



相关文章
|
传感器 芯片
STM32--PWR电源控制
STM32--PWR电源控制
600 0
STM32--PWR电源控制
|
XML JSON 数据可视化
Etcd 可视化管理工具,GUI 客户端
Etcd 可视化管理工具,GUI 客户端
1058 0
|
12月前
|
前端开发 UED 开发者
开发同学如何理解业务?
本文深入探讨了理解业务的重要性及其对于软件开发流程的深远影响。
|
存储 缓存 安全
go sync.Pool 设计与实现
go sync.Pool 设计与实现
185 2
|
JSON JavaScript Java
对比JSON和Hessian2的序列化格式
通过以上对比分析,希望能够帮助开发者在不同场景下选择最适合的序列化格式,提高系统的整体性能和可维护性。
444 3
基于LangChain手工测试用例转Web自动化测试生成工具
该方案探索了利用大模型自动生成Web自动化测试用例的方法,替代传统的手动编写或录制方式。通过清晰定义功能测试步骤,结合LangChain的Agent和工具包,实现了从功能测试到自动化测试的转换,极大提升了效率。不仅减少了人工干预,还提高了测试用例的可维护性和实用性。
【Java基础面试五】、 int类型的数据范围是多少?
这篇文章回答了Java中`int`类型数据的范围是-2^31到2^31-1,并提供了其他基本数据类型的内存占用和数值范围信息。
【Java基础面试五】、 int类型的数据范围是多少?
|
机器学习/深度学习 数据采集 人工智能
【AI在金融科技中的应用】详细介绍人工智能在金融分析、风险管理、智能投顾等方面的最新应用和发展趋势
人工智能(AI)在金融领域的应用日益广泛,对金融分析、风险管理和智能投顾等方面产生了深远影响。以下是这些领域的最新应用和发展趋势的详细介绍
1801 1
|
网络安全 数据安全/隐私保护
网工救急秘籍:四种恢复 console 口密码的神奇方法背后藏着怎样的玄机?
【8月更文挑战第19天】作为网络工程师,遇到设备console口密码遗忘实属头疼。这里有四大救急法助你迅速解决:一是调整配置寄存器值让设备忽略原有配置;二是利用无密码的备份配置文件恢复;三是重置设备至出厂设置(慎用);四是通过硬件短接清除密码(需谨慎)。这些方法曾在关键时候帮助我解决了客户的网络危机,避免业务中断。记得恢复后要设置强密码并妥善保管,确保网络安全稳定。
488 0
|
Java 测试技术 Nacos