Vuex 是什么?

作者: 浩3108 | 来源:发表于2017-10-25 13:50 被阅读149次
官方解释:

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

状态管理模式

状态自管理应用包含以下几个部分:

  • state,驱动应用的数据源;
  • view,以声明方式将 state 映射到视图;
  • actions,响应在 view 上的用户输入导致的状态变化。
单向数据流.png

当应用遇到多个组件共享状态时,单向数据流的简洁性很容易被破坏:

  • 多个视图依赖于同一状态。
  • 来自不同视图的行为需要变更同一状态。

[
例如:
在 template 中我们可以方便的访问项目列表并且进行过滤、排序等操作,
不过如果我们在另一个列表中也需要来展示相同的数据信息,继续按照这种方式实现的话我们不得不重新加载一遍数据,
而且如果用户在本地修改了某个列表数据,那么如何同步两个组件中的列表信息。

因为vue是组件化,多组件共享时,会遇到多个视图公用一个数据或者状态,多个方法或者动作共同改变同一个数据或者状态,所以会导致单向数据流被破坏而且代码混乱无法维护,所以才会有vuex出现。
]

所以vuex就是把组件的共享状态抽取出来,用一个全局单例模式进行管理

vuex示意图.png

上述是vuex官方解释,没听懂,没关系,咱们在抽象一下。

抽象解释:

我们可以把
vuex想象成一个“公共的属性和方法库”,把所有公共的地方合并在一起的大对象。
或者把
vuex想象成为了方便前端数据的操作而建立的一个“前端数据库”

好,先酝酿一下。
我们来试着实现一个迷你的vuex。

因为模块间是不共享作用域的,那么B模块想要拿到A模块的数据,要怎么办?

我们会定义一个全局变量,叫store吧,也就是window.store
然后我们要把A模块要共享的数据作为属性挂到B模块上。
这样我们在B模块中通过window.store就获取到这个数据了。
之后我们就获取到了A模块和B模块共享的数据,叫做state
虽然B模块拿到了A模块的数据state,但是这个数据不是一成不变的,
A模块是要操作这个数据的。
所以说我们就要在state这个数据改变时通知一下B模块
那写个自定义事件吧。。。

好了,这就是一个迷你的vuex。而vuex也就帮你做这点事儿的。

Vuex API

Vuex 中 Store 的模板化定义如下:
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const store = new Vuex.Store({
  state: {
  },
  actions: {
  },
  mutations: {
  },
  getters: {
  },  
  modules: {
    
  }
})
export default store

上述代码中包含了定义 Vuex Store 时关键的 5 个属性:
  • state: state 定义了应用状态的数据结构,同样可以在这里设置默认的初始状态。
state: {
  projects: [],
  userProfile: {}
}
  • actions:Actions 即是定义提交触发更改信息的描述,常见的例子有从服务端获取数据,在数据获取完成后会调用store.commit()来调用更改 Store 中的状态。可以在组件中使用dispatch来发出 Actions。
actions: {
    LOAD_PROJECT_LIST: function ({ commit }) {
      axios.get('/secured/projects').then((response) => {
        commit('SET_PROJECT_LIST', { list: response.data })
      }, (err) => {
        console.log(err)
      })
    }
  }
  • mutations: 调用 mutations 是唯一允许更新应用状态的地方。
mutations: {
    SET_PROJECT_LIST: (state, { list }) => {
      state.projects = list
    }
  }
  • getters: Getters 允许组件从 Store 中获取数据,譬如我们可以从 Store 中的 projectList 中筛选出已完成的项目列表:
getters: {
 completedProjects: state => {
  return state.projects.filter(project => project.completed).length
 }
}
  • modules: modules 对象允许将单一的 Store 拆分为多个 Store 的同时保存在单一的状态树中。随着应用复杂度的增加,这种拆分能够更好地组织代码,更多细节参考这里

相关文章

  • Vuex

    安装Vuex cnpm install vuex --save-dev Vuex是什么? 这是[Vuex的官网](...

  • 使用 Vue.js 2 + Vuex 创建 Notes App

    Vuex 是什么? Vuex is a state management pattern + library fo...

  • 配置 vuex 和 vuex 本地持久化

    配置 vuex 和 vuex 本地持久化 目录 vuex是什么 vuex 的五个核心概念State 定义状态(变量...

  • vuex

    配置 vuex 和 vuex 本地持久化 目录 vuex是什么 vuex 的五个核心概念State 定义状态(变量...

  • vuex的使用

    配置 vuex 和 vuex 本地持久化 目录 vuex是什么 vuex 的五个核心概念State 定义状态(变量...

  • vuex

    参考链接 https://vuex.vuejs.org/zh-cn/ Vuex 是什么? Vuex 是一个专为 ...

  • vuex介绍

    一、vuex介绍(1)vuex是什么? 借鉴 了Flux、Redux、 The Elm Architecture ...

  • vuex

    烨竹 参考:https://vuex.vuejs.org/zh/ Vuex 是什么? Vuex 是一个专为 Vue...

  • Vuex 学习笔记

    前言 学习vuex之前,我提出了3个疑问。Vuex 官网 vuex 是什么?官方文档解释:vuex 是一个专为 V...

  • vuex官方文档细说

    官网地址:https://vuex.vuejs.org/zh-cn/ vuex是什么 首先,vuex是一种设计思想...

网友评论

    本文标题:Vuex 是什么?

    本文链接:https://www.haomeiwen.com/subject/wtxqpxtx.html