Vue.js进阶系列(56)--Vuex总结篇

小编已经Wie大家分享完了有关Vuex的知识,下面进行简单的总结。


一、store的目录结构

  在前面,我们都将 state、mutations、getters、actions、module 放在index.js文件中,当代码量多的时候,就不利于管理,所以我们一般都将 mutations、getters、actions、module 抽离出去。具体的抽离结构如下:


  分别将getters、actions、module、mutations抽离成单独的文件,如果在store中的module中又包含了很多的小模块,就将小模块放到modules文件夹下面,然后每个单独是小模块又是单独的文件。
  我们一般不将state抽离出去,而是放在index.js文件中便于查看当前有哪些状态是被共享的。抽离后的index.js代码如下:

下面进行Vuex的知识总结。


二、Vuex基本概念

1.定义

Vuex是一个管理共享状态的管家,并且该状态是响应式的

2.状态管理

主要分成单界面管理和多界面管理

① 单界面管理

  首先明白三个概念:State:状态;View:视图层;Actions:主要是用户的各种操作:点击、输入等等,会导致状态的改变。
  而所谓的单界面就是指State、View、Action都是在同一个页面中的,所以叫做单页面状态管理。具体运作方式如下图:


② 多界面状态管理

  多界面状态管理就是指当某个状态被多个界面同时共享时,我们需要一个管家来管理这个被多界面共享的状态。具体的运作过程见下图:


3.使用方式

首先在终端安装Vuex,然后创建Vuex实例,最后书写相关的代码。具体使用如下图:



三、核心概念

Vuex中包含了5个核心概念,分别是:state、actions、getters、module、mutations。

1.state--单一状态树

  为了不让状态信息保存到多个Store对象中的,Vuex使用了单一状态树来管理应用层级的全部状态。
  也就是在项目中最好只new 一个store对象,然后所有状态有关的东西都放在一个store中的state进行统一的管理。

2.getters

① 定义

  getters 相当于计算属性。当数据要经过一系列变化时,将这一系列的变化写在getters内部。

② 使用

  在getters中声明一个方法,该方法的默认参数是state,然后返回相应的结果即可。具体代码如下:

//index.js
getters:{
      powerCounter(state){
        return state.counter * state.counter
      }
    }
<!--App.vue 文件-->
<template>
  <div id="app">
    {{$store.getters.powerCounter}}
  </div>
</template
③ 参数

  getters中出了默认的state之外,还可以传递getters参数,用来获取当前getters中的方法。比如:

const store = new Vuex.Store({
    state:{
      student:[
        {id:100,name:'zhangsan',age:21},
        {id:200,name:'lisi',age:18},
        {id:300,name:'wangwu',age:22},
        {id:400,name:'zhaoliu',age:19}
      ]
    },
    getters:{
      morestu(state){
        return state.student.filter(s => s.age>20)
      },
      morestuLength(state,getters){
        return getters.morestu.length
      }
    }
})

在morestuLength方法中通过参数getters获取了morestu方法的结果

④ 返回值

返回值可以返回变量,还可以返回函数。比如:

//返回变量
getters:{
      powerCounter(state){
        return state.counter * state.counter
      }
    }

//返回函数
    getters:{
      moreAgeStu(state){
        return function(age){
          return state.student.filter(s => s.age>age)
        }
      }
    }

3.mutations

① 作用

  Vuex的store状态的更新唯一方式:提交Mutation。也就是我们前面提到过的,必须经过 state --> Vuex --> Action --> Mutations 这个路径修改state的状态。

② 组成

主要由事件类型回调函数组成。比如:

mutations:{
    increase(state){
      state.counter++
      }

increase时间类型,(state){ state.counter++}是回调函数

③ 定义方式

主要是事件类型+回调函数,具体代码如上所示,这里不再展示

④ 参数

传递的参数主要有默认的state、变量和函数

⑤ 提交风格

主要有两种方式,一种是commit,一种是type
参数和提交风格可以参考这篇文章 https://www.jianshu.com/p/e695ab292460

⑥ 响应规则

  相应的原理是预先在store对象定义的属性会被加入到响应式系统中,而没有预先在store对象定义的属性不会被加入到响应式系统中,但是可以通过set方法使新增加的属性具有响应式。具体做法参考该文章:https://www.jianshu.com/p/e8a13d8b43a9

⑦ 常量类型

  使用常量替代Mutation事件的类型。将这些常量放在一个单独的文件中, 方便管理以及让整个app所有的事件类型一目了然。具体的使用方式见该文章:https://www.jianshu.com/p/9802842448bc

4.actions

① 定义

Action类似于Mutation, 但是是用来代替Mutation进行异步操作的

② 使用

使用方式和mutations类似,只是默认的参数是context,而且调用时是用dispatch调用的。

③ 参数

传递的参数很简单,这里不叙述

④ 在内容使用Promise

  使用Promise的目的是,除了修改数据之外还可以进行别的操作。一般将修改的数据写在Promie内部,然后别的操作写在then函数内,具体可以参考该文章:https://www.jianshu.com/p/3f566f48401f

5.module

  Vuex允许我们将store分割成模块(Module), 而每个模块拥有自己的state、mutation、action、getters等。
  mudole中的state、mutation、action、getters方式的书写和在store中书写是一样的,这里就不再叙述,不过要注意的是:在模块中,context.commit()仅仅提交自己模块的方法而不包括store中的方法。具体的可以参考该文章:https://www.jianshu.com/p/f4cb00cd0574

以上就是Vuex的全部内容,写的不好的地方还请大家多多包涵o( ̄︶ ̄)o

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。