vue——vuex

86 篇文章 0 订阅
73 篇文章 0 订阅

Vuex

vuex是什么?

1.vuex的概念:专门在Vue中实现集中式状态(数据)管理的一个vue插件,对vue应用中多个组件的共享状态进行集中式的管理(读/写), 也是一种组件之间通信的方式,且适用于任意组件间通信

2.Github地址:https://github.com/vuejs/vuex

什么时候使用vuex?

1.多个组件依赖于同一状态

2.来自不同组件的行为需要变更同一状态

先执行import,再执行其他的代码

main.js

import Vue from 'vue'
import App from './App.vue'
//store的s不能大写
import store from "./store"

// 关闭vue的生产提示
Vue.config.productionTip = false;
new Vue({
    store,
    render: h => h(App),
}).$mount('#app')

store/index.js

// store
// 引入vuex、vue
import Vuex from 'vuex'
import Vue from 'vue'

// 准备actions——用于响应组件中的动作
const actions = {};
// 准备mutations——用于操作数据(state)
const mutations = {};
// 准备state——用于存储数据
const state = {

};
Vue.use(Vuex);
// 创建并导出vuex
export default new Vuex.Store({
    actions,
    mutations,
    state
})
VUEX的基本使用

1.初始化数据,配置actions、配置mutations,操作store

求和案例:

vue文件

<template>
  <div>
    <h2>当前的和为:{{ $store.state.sum }}</h2>
    <!-- v-model.number双向绑定的是number类型的 -->
    <select v-model.number="num">
      <!-- value="1"中的1是字符串类型,:value="1"中的1是number类型 -->
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
    </select>
    <button @click="add">+</button>
    <button @click="sub">-</button>
    <button @click="addOdd">当前和为奇数再加</button>
    <button @click="addWait">等一等再加</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      num: 1, //选择的数字
    };
  },
  methods: {
    add() {
      //   this.$store.dispatch("addNum", this.num);
      this.$store.commit("ADDNUM", this.num);
    },
    sub() {
      //   this.$store.dispatch("subNum", this.num);
      this.$store.commit("SUBNUM", this.num);
    },
    addOdd() {
      this.$store.dispatch("OddNum", this.num);
    },
    addWait() {
      this.$store.dispatch("delay", this.num);
    },
  },
};
</script>

<style>
</style>

store/index.js

// store
// 引入vuex、vue
import Vuex from 'vuex'
import Vue from 'vue'
// 使用vuex
Vue.use(Vuex);

// 准备actions——用于响应组件中的动作
const actions = {
    // 加减这两个操作无需放在actions里面,多余的
    /* // 加
    addNum(context, val) {
        // console.log(context);
        // console.log(val);
        context.commit('ADDNUM', val)
    },
    // 减
    subNum(context, val) {
        context.commit('SUBNUM', val)
    }, */
    // 奇数时减
    OddNum(context, val) {
        if (context.state.sum % 2) {
            context.commit('ADDNUM', val)
        }
    },
    // 延时操作
    delay(context, val) {
        setTimeout(() => {
            context.commit('ADDNUM', val)
        }, 500);
    }
};
// 准备mutations——用于操作数据(state)
const mutations = {
    ADDNUM(state, val) {
        state.sum += val
    },
    SUBNUM(state, val) {
        state.sum -= val
    }
};
// 准备state——用于存储数据
const state = {
    sum: 0, //和
};
// 创建并导出vuex
export default new Vuex.Store({
    actions,
    mutations,
    state
})

2.组件中读取vuex中的数据:$store.state.xxx

3.组件中修改vuex中的数据:

this.$store.dispatch("actions中的方法名", 数据);
或
this.$store.commit("mutations中的方法", 数据);

备注:若没有网络请求或其他业务逻辑,组件中也可以越过actions,即直接用commit,调用mutations中的方法

getters的使用

1.概念:当state中的数据需要经过加工后再使用时,可以使用getters加工

2.配置getters

const getters={
	newNum(state){
		return state.num*10
	}
}

export default new Vuex.Store({
	...
	getters
})

3.组件中读取数据:$store.getters.newNum

四个map方法的使用

使用之前要先映射:

// 映射状态
import { mapState, mapMutations, mapActions, mapGetters } from "vuex";

1.mapState方法:用于帮助我们映射state中的数据为计算属性

2.mapGetters方法:用于帮助我们映射getters中的数据为计算属性

computed: {
    //   借助mapState生成计算属性,从state中读取数据(对象写法)
    // ...mapState({ sum: "sum", school: "school", subject: "subject" }),
    //   借助mapState生成计算属性,从state中读取数据(数组写法)
    ...mapState(["sum", "school", "subject"]),
    /* dSum() {
      return this.$store.getters.dSum;
    }, */
    //借助mapgetters生成计算属性,从getters中读取数据(对象写法)
    //...mapGetters({dSum:'dSum'}),
    //借助mapgetters生成计算属性,从getters中读取数据(数组写法)
    ...mapGetters(["dSum"]),
  },

3.mapSctions:用于帮助我们生成与actions对话的方法,即:包含$store.dispatch(xxx)的函数

4.mapMutations方法:用于帮助我们生成与mutations对话的方法,即$store.commit(xxx)的函数

 methods: {
    // 对象写法
    // ...mapMutations({ ADDNUM: "ADDNUM", SUBNUM: "SUBNUM" }),
    // 借助mapMutations生成对应的方法,方法中会调用commit去联系Mutations,数组写法
    ...mapMutations(["ADDNUM", "SUBNUM"]),
    // 借助mapActions生成对应的方法,方法中会调用dispatch去联系mapActions,数组写法
    ...mapActions(["OddNum", "delay"]),
    // 对象写法
    ...mapActions({ OddNum: "OddNum", delay: "delay" }),
  },

案例:

vue文件

<template>
  <div>
    <h2>当前的和为:{{ sum }}</h2>
    <h4>加工后的和为:{{ dSum }}</h4>
    <h3>我在{{ school }}学习{{ subject }}</h3>
    <!-- v-model.number双向绑定的是number类型的 -->
    <select v-model.number="num">
      <!-- value="1"中的1是字符串类型,:value="1"中的1是number类型 -->
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
    </select>
    <!-- <button @click="add">+</button>
    <button @click="sub">-</button>
    <button @click="addOdd">当前和为奇数再加</button>
    <button @click="addWait">等一等再加</button> -->
    <button @click="ADDNUM(num)">+</button>
    <button @click="SUBNUM(num)">-</button>
    <button @click="OddNum(num)">当前和为奇数再加</button>
    <button @click="delay(num)">等一等再加</button>
  </div>
</template>

<script>
// 映射状态
import { mapState, mapMutations, mapActions, mapGetters } from "vuex";
export default {
  data() {
    return {
      num: 1, //选择的数字
    };
  },
  methods: {
    //   程序员写的
    /* add() {
      //   this.$store.dispatch("addNum", this.num);
      //   this.$store.commit("ADDNUM", this.num);
      this.ADDNUM(this.num);
    },
    sub() {
      //   this.$store.dispatch("subNum", this.num);
      //   this.$store.commit("SUBNUM", this.num);
      this.SUBNUM(this.num);
    },
    addOdd() {
      //   this.$store.dispatch("OddNum", this.num);
      this.OddNum(this.num);
    },
    addWait() {
      //   this.$store.dispatch("delay", this.num);
      this.delay(this.num);
    }, */
    // 对象写法
    // ...mapMutations({ ADDNUM: "ADDNUM", SUBNUM: "SUBNUM" }),
    // 借助mapMutations生成对应的方法,方法中会调用commit去联系Mutations,数组写法
    ...mapMutations(["ADDNUM", "SUBNUM"]),
    // 借助mapActions生成对应的方法,方法中会调用dispatch去联系mapActions,数组写法
    ...mapActions(["OddNum", "delay"]),
    // 对象写法
    ...mapActions({ OddNum: "OddNum", delay: "delay" }),
  },
  computed: {
    // 程序员写的
    /* sum() {
      return this.$store.state.sum;
    },
    school() {
      return this.$store.state.school;
    },
    subject() {
      return this.$store.state.subject;
    }, */
    //   借助mapState生成计算属性,从state中读取数据(对象写法)
    // ...mapState({ sum: "sum", school: "school", subject: "subject" }),
    //   借助mapState生成计算属性,从state中读取数据(数组写法)
    ...mapState(["sum", "school", "subject"]),
    /* dSum() {
      return this.$store.getters.dSum;
    }, */
    ...mapGetters(["dSum"]),
  },
};
</script>

<style>
</style>

store文件

// store
// 引入vuex、vue
import Vuex from 'vuex'
import Vue from 'vue'
// 使用vuex
Vue.use(Vuex);

// 准备actions——用于响应组件中的动作
const actions = {
    // 加减这两个操作无需放在actions里面,多余的
    /* // 加
    addNum(context, val) {
        // console.log(context);
        // console.log(val);
        context.commit('ADDNUM', val)
    },
    // 减
    subNum(context, val) {
        context.commit('SUBNUM', val)
    }, */
    // 奇数时减
    OddNum(context, val) {
        if (context.state.sum % 2) {
            context.commit('ADDNUM', val)
        }
    },
    // 延时操作
    delay(context, val) {
        setTimeout(() => {
            context.commit('ADDNUM', val)
        }, 500);
    }
};
// 准备mutations——用于操作数据(state)
const mutations = {
    ADDNUM(state, val) {
        state.sum += val
    },
    SUBNUM(state, val) {
        state.sum -= val
    }
};
// 准备state——用于存储数据
const state = {
    sum: 0, //和
    school: 'XXX学院',
    subject: '前端'
};
// 准备getters——用于将state中的数据进行加工处理,相当于vue中的computed计算属性
const getters = {
    dSum(state) {
        return state.sum * 10
    }
};


// 创建并导出vuex
export default new Vuex.Store({
    actions,
    mutations,
    state,
    getters
})

模块化+命名空间

开启命名空间:namespaced: true,

1.目的:让代码更好维护,让多种数据分类更加明确

2.修改store

3.开启命名空间后,组件中读取state 数据:

方式一:
this.$store.state.xxxx.list
方式二:
...mapState('xxxx',['数据名','数据名','数据名','数据名'])

4.开启命名空间后,组件中读取getters数据 :

方式一:
this.$store.getters["xxxx/list"]
方式二:
...mapGetters('xxxx',['数据名','数据名','数据名','数据名'])

5.开启命名空间后,组件中调用dispatch,来调用actions中的方法

方式一:
this.$store.dispatch("xxxx/方法名",传的实参)
方式二:
...mapActions('xxxx',{页面中的方法:"actions中的方法",页面中的方法:"actions中的方法"})

6.开启命名空间后,组件中调用commit,来调用mutations中的方法

方式一:
this.$store.commit("xxxx/方法名",传的实参)
方式二:
...mapMutations('xxxx',{页面中的方法:"mutations中的方法",页面中的方法:"mutations中的方法"})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值