仓库Vuex

1. 搭建vuex仓库

1.1 安装 

npm install vuex@next

1.2 引入 

创建store文件夹,里面创建index.js,该js文件中写:

import { createStore } from 'vuex'
// 引入子仓库
import model1 from "./model1.js"
import model2 from "./model2.js"
const store = createStore({
	modules:{
		  model1:model1,
		  model2:model2,
	}
})
export default store;

main.js文件中需要引入index.js:

import store from "./store/index.js";
const app = createApp(App);
// 将 store 实例作为插件安装
app.use(store);

 1.3 在各个子仓库中写代码

// 基本结构
export default {
	namespaced:true,
	state(){// 状态
		  return { }
	},
	getters:{ // 类似于计算属性,里面写函数,但当属性用} ,
	mutations:{   // 只能同步修改仓库中的state,需要提交载荷},
	actions:{   // 异步修改仓库中的state },
}

1.4 每个组件中的使用方式

this.$store.state.model1.count // module1状态中的count this.$store.state.model2.count // module2状态中的count this.$store.commit("model1/countIncrement",100) => module1 的mutations this.$store.commit("model2/countIncrement",200) => module2 的mutations this.$store.getters["model1/mycount"] => module1 的getters this.$store.getters["model2/mycount"] => module2 的getters this.$store.dispatch("model1/changeArr",100) => module1 的actions this.$store.dispatch("model2/changeArr",200) => module2 的actions

介绍:vuex是为vue框架开发的状态管理模式

2 语法

2.1. state

我个人理解的是,类似于vue框架中的data,都是函数(设计成函数是为了给每个组件/仓库提供独立的数据),里面用来存放数据的。

使用——{{ $store.state.状态名 }}

访问——this.$store.state.状态名

从 store 实例中读取状态最简单的方法就是在计算属性computed中返回某个状态中的状态名。下面给一个简单案例来促进理解:

//App组件中



//Box组件中也可以使用

box组件

{{ $store.state.msg }}

仓库Vuex_第1张图片

2.2. getters

用来获取数据,类似于vue框架中的computed属性,里面写函数,当state中的数据改变时,就会自行调用这个函数。接下来给个计算年龄的案例来理解:

// index.js文件中
state() {
    return {
      birth: "1998-03-28",
    }
},
getters: {
  getage(state) {
    // state参数为state对象
    return new Date().getFullYear() - new Date(state.birth).getFullYear();
  },
}

// App组件中

getters---{{ $store.getters.getage }}--方法{{ getAge() }}

//script标签中 methods: { getAge() { return this.$store.getters.getage; }, }

通过上面案例会发现,通调用方法的形式也可以实现getters里面的getage函数的功能,那就是在getage方法中返回一个通过this.$store来访问store对象中的getters中的函数。

2.3. mutations——commit提交载荷

更改Vuex的store中state的唯一方法时提交mutation(同步修改)。一般载荷应该是一个对象,这样就可以在里面放置多个字段,使记录的mutation更可读。可以在mutations中提交荷载,也可以在组件中提交荷载。

在index.js中的mutations对象中设计方法,App组件中触发事件,然后提交载荷,这样mutations中的方法就可以接收到修改的数据,然后进行state的修改。给个简单案例来理解mutations。

// index.js中
  mutations: {
    change_birth(state, action) {
      //state中放的时整个state对象
      //action中放提交载荷提交过来的信息
      console.log(state, action);
      // 注:需要通过.value才能取到值
      state.birth = action.value;
    }
  }

// App组件中

mutations---birth-{{ $store.getters.change_birth }}

// 用来触发方法 methods: { getAge() { return this.$store.getters.getage; }, fn() { // 提交载荷可以为对象形式,也可以为一个基本数据 let action1 = { type: 'BIRTH', value: '1997-07-08' }; // 组件中提交载荷为action1 this.$store.commit('change_birth', action1); } }

仓库Vuex_第2张图片

2.4. actions——dispatch提交载荷

可以异步且间接地修改数据,因为它接收到组件传来的参数后,需要再次用commit提交载荷,然后通过mutations来修改仓库的state。跟上面的功能一样,只是采用dispatch来提交载荷。

设计:actions:{ 设计函数 } 函数得到的第一个参数为整个store对象

使用:this.$store.dispatch('上面设计的函数名' , 传参数可以是对象)

总结:mutations和actions的区别?

           1. mutations通过commit提交载荷来修改仓库的state;actions通过dispatch提交载荷来间接修改仓库的state;

            2. mutations中只能写同步的业务,actions可以写异步的业务,异步commit载荷到mutation中。

// App组件中
methods: {
    fn() {
       let action3 = {type:'ARR',value: '123456' };
       this.$store.dispatch("changeArr", { type: 'ARR', value: '123456' });
    }
}


// index.js中
  mutations: {
    ARR(state, action) {
      state.arr = action;
    },
  },
 actions: {
    changeArr(ctx, action) {
      // ctx参数是整个store对象
      // 提交载荷,上面ARR函数接收到提交的载荷
      store.commit("ARR", action);
    },
  },

2.5. model

小仓库,可以用来使用模块化开发,每个小仓库里面都有自己的state、getters、mutaions、actions。然后在index.js主文件中引入小仓库。

你可能感兴趣的:(前端,javascript,vue.js)