vuex配置及使用

173 阅读4分钟

vuex配置及使用

// 配置vuex

// 下载vuex包
// yarn add Vuex@3

// vuex引入

import Vuex from 'vuex'

// 2.vuex注册

Vue.use(Vuex)

// 3.vuex实例化

const store = new Vuex.Store({

 // 数据

 state: {

  // 管理数据

  count: 6

 }

})

Vue.config.productionTip = false



new Vue({

 // 4.vuex挂载

 store: store,

 render: h => h(App),

}).$mount('#app')

1656398763986

state 存放数据

1、概念

官方描述:state是放置所有公共状态的书写,如果你有一个公共状态数据,你只需要定义在state对象中。

大白话:state是vuex提供给我们声明全局变量的对象,如果我们想要声明一个全局变量,那么只需要把这个变量声明在state对象中即可

1、在实例化store对象的时候,通过state声明变量


<template>
  <div>
    <!-- 1.0版 -->
    <div>state的数据:{{ $store.state.count }}</div>
    <!-- 2.0版 -->
    <div>state的数据:{{ Mycount }}</div>
    <!-- 辅助函数 -->
    <div>state的数据:{{ count }}</div>
  </div>
</template>

<script>
// 辅助函数----
import { mapState } from "vuex";
console.log(mapState(["count"]));
export default {
  // 1.0版
  // created() {
  //   console.log("10", this.$store.state.count);
  // },
  // 2.0版
  computed: {
    Mycount() {
      return this.$store.state.count;
    },
    // 辅助函数----
    ...mapState(["count"]),
  },
};

image.png

mutations 同步更新数据

官方:state数据的修改只能通过mutations,并且mutations必须是同步更新,目的是形成“数据快照”

大白话:mutations是vuex专门提供给开发来修改state数据的对象,mutations中只能写同步代码。

1.mutations基础用法

1、在state属性的同级地方添加mutations属性

image.png 代码

如何调用mutations中声明的函数呢?

语法:$store.commit('函数名')

  mutations: {
    // 自定义函数修改count的值
    addCount(state) {
      // state这是个内置的参数 指的是mutations同级的state
      state.count += 1
    }
  }
<button @click="$store.commit('addCount')">1111</button>

image.png

2.优化mutations

把调用mutations函数的代码提取到函数中进行使用

image.png

代码

 mutations: {
    // 自定义函数修改count的值
    addCount(state, payload) {
      // state这是个内置的参数 指的是mutations同级的state
      state.count += payload
    }
  }
 <button @click="changeCount(6)">1111</button>
methods: {
    changeCount(num) {
      this.$store.commit("addCount", num);
    },
  },

3.辅助函数mutations

、辅助函数是为了优化mutations中函数的使用而存在的,这个辅助函数叫:mapMutations

2、使用语法:mapMutations([ '调用的函数名' ])

image.png

代码

<button @click="addCount(6)">1111</button>
import { mapMutations } from "vuex";
console.log(mapMutations(["addCount"]));

...mapMutations(["addCount"]),

image.png

actions 负责进行异步操作

state是存放数据的,mutations是同步更新数据的,actions则是负责异步操作

大白话:actions负责异步操作(通常都是ajax请求),然后通过mutations来间接修改state中的数据。

1.actions基础方法

image.png

代码

 actions: {
    getAsyncCount(store, num) {
      setTimeout(() => {
        store.commit('addCount', num)
      }, 3000)
    }
  }
   <button @click="$store.dispatch('getAsyncCount', 10)">1111</button>

image.png

2.优化使用

image.png

3.辅助函数的使用

1、辅助函数是为了优化actions中函数的使用而存在的,这个辅助函数叫:mapActions

2、使用语法:mapActions([ '调用的函数名' ])

image.png

getters

1、概念

官方:除了state之外,有时我们还需要从state中派生出一些状态,这些状态是依赖state的,此时会用到getters

大白话:除了state之外,我们还有能够通过getters来声明全局变量,而这些声明在getters中的变量的值是依赖于state中的数据得来。

主要作用(使用场景):就是简化state中变化访问

2、基本使用

image.png

3、优化使用

image.png

4、辅助函数的使用

1、辅助函数是为了优化getters中函数的使用而存在的,这个辅助函数叫:mapGetters

2、使用语法:mapGetters([ '调用的函数名' ])

image.png

modules

1、概念

官方:由于使用单一状态树,应用的所有状态会集中到一个比较大的对象state中,当应用(项目)变得非常复杂的时候,就有可能变得相当臃肿。vuex会变得越来越难以维护,由此,有了vuex的模块化。

大白话:因为所有的数据都是声明在state对象中的,当我们的项目变得非常复杂的时候,我们的state对象就会变得相当臃肿,vuex就变得难以维护,由此,有了vuex的模块化,也就是分模块来保存数据。

2、基本使用

1、vuex专门提供了一个modules属性给我们声明模块,这个属性只要写在和state、mutations、actions、getters同级的位置上即可。

const store = new Vuex.Store({
    state:{},
    mutations: {},
    actions: {},
    getters: {},
    modules: {}
})

2、直接在modules中声明模块即可,每个模块都有state、mutations、actions、getters、modules

例如:我们在modules中声明两个模块,分别是user和setting模块

const store = new Vuex.Store({
    modules: {
        user: {
            state: {
                token
            }
        },
        setting: {
            state: {
                name: 'vuex实例'
            }
        }
    }
})

3、如何访问模块中的变量呢

语法:$store.state.模块名.属性名

<h1>
    获取user模块中的token
    {{$store.state.user.token}}
</h1>

3、优化使用

利用getters来优化使用模块中的变量

image.png

4、修改模块中的数据

当我们在模块中通过mutations来修改数据,最后调用模块中的mutations函数的时候发现和之前写在模块外面的mutations函数一模一样,

因此可以得出结论:默认情况下,模块内部的action、mutations、getters都注册在全局的。

image.png

5、如何才能使得模块中的mutations具有独立命名空间呢

我们可以通过namespaced属性设置为true, 从而给user模块加一道锁,此刻user模块中的所有内容都是局部的,都必须通过模块名才能访问到,该模块就叫具有独立的命名空间

比如:我们要访问mutations中的setToken函数,必须要通过user模块名来访问,

如何通过模块名访问呢?

答:有相应的语法进行访问

语法:$store.commit('模块名/函数名')

image.png

vuex的封装使用

image.png

image.png 1656776591704