Vuex的应用场景
- state(存放状态) 、
- action(提交mutation,进行异步操作)
- getters(state的计算属性)
- modules(将store模块化)
- mutation(更改状态逻辑,进行同步操作)
- state
- Vuex其实就是一个仓库,仓库里面放了很多对象。其中state就是存放数据源的地方,对应与Vue对象里面的data
- 其中state里面存放的数据为响应式数据,Vue组件从store仓库中读取数据,若仓库中的数据发生改变的时候,依赖这个数据的组件也会随之更新
- state通过mapState把全局的state和getters映射到当前组件的computed计算属性中
- getters
- getters可以对state进行计算操作,它就是store的计算属性
- 虽然在组件内也有计算属性,但是getters可以在多组件复用
- 如果一个状态只在一个组件内使用,可以不用getters
- mutation
- action类似于mutation
- mutation必须是同步操作
- action可以包含任意的异步操作
- action提交的是mutation,不是直接变更状态
- 视图触发action,action触发mutation
- action类似于mutation
不多**,代码供上
const store = new Vuex.Store({state: {// 存放状态},getters: {// state的计算属性},mutations: {// 更改state中状态的逻辑,同步操作},actions: {// 提交mutation,异步操作},// 如果将store分成一个个的模块的话,则需要用到modules。//然后在每一个module中写state, getters, mutations, actions等。modules: {a: moduleA,b: moduleB,// ...}});
Vuex的作用
不用Vuex的弊端
- 可维护性会下降,你要想修改数据,你得维护三个地方
- 可读性会下降,因为一个组件里的数据,你根本就看不出来是从哪来的
- 增加耦合,大量的上传派发,会让耦合性大大的增加,本来Vue用Component就是为了减少耦合,现在这么用,和组件化的初衷相背。
辅助函数
知识点
首先在讲解用法前我们先创建一个仓库实例
import Vue from 'vue'import Vuex from 'vuex'import {Mockurl} from '@/until'Vue.use(Vuex)export default new Vuex.Store({state: {count:0,data:[],sex:0},mutations: {changeData(state,actions){state.data = [...actions.data]},add(state){++state.count},dis(state){--state.count}},actions: {getData(store){axios.get('/get/data').then(data=>{store.commit('changeData',data)})}},getters:{sex(state){return state.sex === 0 ? '男':'女'}}})
mapState读取仓库状态
<template><div>{{count}}</div></template><script>import { mapState } from 'vuex'export default {computed:{...mapState(['count']),}}</script>
mapMutations 修改仓库状态
<template><div><span @click="dis" >-</span>{{count}}<span @click="add" >+</span></div></template><script>import { mapMutations } from 'vuex'export default {methods:{...mapMutations(['add','dis'])}}</script>
mapActions 异步处理
<script>import { mapActions } from 'vuex'export default {methods:{...mapActions(['getData'])}}</script>
getters 数据派生
<template><div>性别:{{sex}}</div></template><script>import { mapGetters } from 'vuex'export default {computed:{...mapGetters(['sex'])}}</script>
