Web前端之路首页投稿(暂停使用,暂停投稿)Vue.js专区

Vuex 是什么?

2017-10-25  本文已影响149人  浩3108
官方解释:

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

状态管理模式

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

单向数据流.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: {
  projects: [],
  userProfile: {}
}
actions: {
    LOAD_PROJECT_LIST: function ({ commit }) {
      axios.get('/secured/projects').then((response) => {
        commit('SET_PROJECT_LIST', { list: response.data })
      }, (err) => {
        console.log(err)
      })
    }
  }
mutations: {
    SET_PROJECT_LIST: (state, { list }) => {
      state.projects = list
    }
  }
getters: {
 completedProjects: state => {
  return state.projects.filter(project => project.completed).length
 }
}
上一篇 下一篇

猜你喜欢

热点阅读