Vuex补充篇

在这里插入图片描述

开门见山
本篇文章主要是对Vuex的用法进行补充,希望可以帮助到大家,其中包括更优雅调用mutation
state,getters,严格模式,以及命名空间
state
vuex中的state存储数据

export default new Vuex.Store({
    state: {
        count: 20,
        msg: "this is vueX State data"
    },
    mutations: {},
    actions: {},
    modules: {},
})

vue项目中使用

方法1<h2>count:{{ $store.state.count }}</h2>

<p>msg:{{ $store.state.msg }}</p>

方法2//引用辅助函数
import { mapState } from 'vuex'

在computed 使用

computed :{
	//需要接收一个数组作为参数,数组里面的key就是state里面的key
	//mapState会返回一个对象,包含两个计算属性对应的方法,这里的两个是数组里面的数量
	//根据情况而定,计算属性的表现形式如下
	//count: state => state.count
	//msg:state => state.msg
	//然后需要使用扩展运算符,用于展开返回对象的成员给computed
    ...mapState( ['count','msg']),
}

vue项目中调用

<h2>count:{{ count }}</h2>

<p>msg:{{ msg }}</p>

//结果是一样的

方法3::

方法2在使用过程中有一个问题,如果当前组件中有重名的时候怎么办呢、

其实这个问题也有解决的办法,mapState中不仅能传递数组而且还能传递对象,

如果传递对象的话可以修改映射的计算属性的名字,如下所示

computed :{
	//key就是自定义的value就是state中的key
    ...mapState( { num: 'count': message:"msg" }),
}
   
vue项目中使用

<h2>count:{{ num }}</h2>

<p>msg:{{ message }}</p>

这三种方法都是一样的
getter
vuex中的getter类似组件中的计算属性,主要是对state中的数据进行简单的处理可以使用getters
reverseMsg
getters :{

	reverseMsg(state){
	//接收一个形参就是state中的数据,
	//处理过后返回处理的result
		return state.msg.split("").reverse().join("")
	}
vue组件中调用总共有3中方法

方式1:
<h2>count:{{ $store.getters.reverseMsg }}</h2>

方式2:
import { mapState ,mapGetters} from 'vuex'
computed :{
	//key就是自定义的value就是state中的key
    ...mapState( { num: 'count': message:"msg" }),
    ...mapGetters(['reverseMsg '])
}
组件中使用
<h2>count:{{ reverseMsg }}</h2>

方法3:
用于处理重名情况
import { mapState ,mapGetters} from 'vuex'

computed :{
	//key就是自定义的value就是state中的key
    ...mapState( { num: 'count': message:"msg" }),
    ...mapGetters({
    	revserse :'reverseMsg '
    })
}
组件中使用
<h2>count:{{ revserse }}</h2>
mutation
在vuex状态的修改必须提交mutation,mutation必须是同步执行的,
这样可以保证能够在mutation可以收集到所有的状态修改
//代码如下

mutation:{
//定义修改数据的行为
	increate(state,payload){
		state.count += payload
	}
//组件中调用 

方法1:
//方法1:第一个形参是mutation里面的函数 第二个参数的需要增加的大小
//与increate一一对应
<button @click = "$store.commit('increate',20)"></button> 
//点击按钮state里面的count 增加 

方法2:
//使用辅助函数和mapGetter / mapState一样 
import { mapMutation } form "vuex"

//mutation里面的方法不再是计算属性,所以需要放在methods中

methonds : { 
	...mapNutations(["increate"])
}
//项目中使用 这样只需要传递一个参数即可
<button @click = "increate(20)"></button> 

方法3:
//方法映射 / 也可以说是防止重名 就是...mapMutation可以传递数组进去

methonds : { 
	...mapNutations({add:"increate"})
}
//项目中使用 这样只需要传递一个参数即可
<button @click = "increate(20)"></button> 
action
//action主要方便异步调用的,例如把请求到的数据保存到state里面
定义action方法

const action = {
    add(context, payload) {
    //这里使用setTimeout模拟异步操作
        setTimeout(() => {
            context.commit("increate", 20)
        }, 2000)
    }
}
组件中调用 总共3中方法

方法1:
<button @click = "$store.dispatch('increate',20)"></button> 

方法2:
//使用辅助函数mapActions 
import { mapActions }  form "vuex" ;
//在methods中调用

methods :{
	...mapActions(['add']) 
}

//项目中使用 这样只需要传递一个参数即可
<button @click = "add(20)"></button> 

方法3:
//方法映射 / 也可以说是防止重名 就是...mapMutation可以传递数组进去

methonds : { 
	...mapNutations({addNumber:"add"})
}

//项目中使用 这样只需要传递一个参数即可
<button @click = "addNumber(20)"></button> 
moodule
模块可以把单一状态数树拆分为多个模块,方便调用,每一个模块都有自己的
state / getters / mutation / action 下面是演示代码
// index.js 
import Vue from 'vue'
import Vuex from 'vuex'
//引入模块文件
import products from './modules/products'
import cart from './modules/cart'

Vue.use(Vuex)

export default new Vuex.Store({
  strict: process.env.NODE_ENV !== 'production',
  state: {
    count: 0,
    msg: 'Hello Vuex'
  },
  getters: {
    reverseMsg (state) {
      return state.msg.split('').reverse().join('')
    }
  },
  mutations: {
    increate (state, payload) {
      state.count += payload
    }
  },
  actions: {
    increateAsync (context, payload) {
      setTimeout(() => {
        context.commit('increate', payload)
      }, 2000)
    }
  },
  modules: {
    products,
    cart
  }
})
//cart.js
const state = {}
const getters = {}
const mutations = {}
const actions = {}

export default {
  namespaced: true,//开启命名空间
  state,
  getters,
  mutations,
  actions
}
//product.jjhjs
const state = {
  products: [
    { id: 1, title: 'iPhone 11', price: 8000 },
    { id: 2, title: 'iPhone 12', price: 10000 }
  ]
}
const getters = {}
const mutations = {
  setProducts (state, payload) {
    state.products = payload
  }
}
const actions = {}

export default {
  namespaced: true,//开启命名空间
  state,
  getters,
  mutations,
  actions
}
//组件中使用
products: {{ products }} <br>
<button @click="setProducts([])">Mutation</button>

computed: {
 //第一个是模块的名字,第二个模块中的key
    ...mapState('products', ['products'])
  },
methods: {
 //第一个是模块的名字,第二个模块中的key
    ...mapMutations('products', ['setProducts'])
  }
严格模式
在vuex中年所有状态的改变必须通过提交mutation,但这里仅仅是一个约定,

在实际开发过程你可以随时改变state中的值,从语法层面来时是没有问题的

但是这样破坏了vuex的约定,如果在开发过程中直接修改了state那么devTools

将无法跟踪state的改变,当我们开启了严格模式之后,直接修改state里面的数据

将会抛出错误 演示如下
export default new Vuex.Store({
  strict: true,//开启严格模式在开发过程直接修改state里面的数据
  //state里面的值会改变,但是控制台将会抛出错误
  state: {
  },
  getters: {
  },
  mutations: {
  },
  actions: {
  },
  modules: {
  }
})
严格模式说明
不要在生产环境开启严格模式,因为严格模式会深度检查状态树,来检查不和规则的改变

这样的话影响性能、开发模式启用严格模式,生产环境关闭严格模式

代码演示如下

让webpack处理这个问题 开发的时候strict值为false 打包的时候strict值为true
strict: process.env.NODE_ENV !== 'production',

篇幅较长,欢迎观看,如有不足,敬请指教

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值