Vue全家桶之Vuex

Vuex是什么?

Vuex 我姑且称之为vue老爷的管家

刚开始学vuex的时候,它给我的感觉类似于cookie、local Storage这种东西。使用时给我带来最方便的就是让组件传值变得更加方便了。

官方把vuex称为状态管理模式(State Management Pattern)。

vuex分为3个part:

  • View 视图
  • Action 行为
  • State 状态数据

vuex机制

怎么运作的:

  • 页面上的一些操作会触发Actions中的一些方法
  • Actions改变State中的数据
  • State中数据有反馈给页面呈现

Vuex好在哪儿?

传统组件传值弊端:

  • 组件层层嵌套多了会导致传值非常麻烦,尤其是兄弟组件传值
  • 代码不易维护

解决办法:

  • 把共享的数据抽离出来单独存放
  • 写一些api去操作数据
  • 这样不管哪个组件要用,直接调用api即可

好处:

  • 代码清晰,维护简单

什么时候应该用vuex?

这个问题参考了vuex官方的解释才明白

简单来说:

  • 中大型单页应用:vuex
  • 小型应用:store模式足矣

注意事项:

1、Vuex和全局对象的区别

  • vuex中的状态是响应式的
  • 改变状态不能直接操作,而是显式地提交mutation。目的是为了把状态的变更记录更好的了解我们的应用

Vuex的核心概念

  • State 定义数据

  • Getters 定义一些方法直接获取State中的数据(或者处理后的数据),跟computed一样

  • Mutations 定义唯一改变State中数据的方法,第一个参数必须是state,剩下的随便

  • Actions 提交执行Mutations的地方

  • Module 用来分隔store成一个个模块,以免变得太大太臃肿

State

  • 首先在一个js文件中声明一个store

    • 1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      import Vue from 'vue'
      import Vuex from 'vuex'
      import todo1 from './modules/todo1.js'
      import todo2 from './modules/todo2.js'
      import todo3 from './modules/todo3.js'

      Vue.use(Vuex)

      const store = new Vuex.Store({
      modules: {
      todo1,
      todo2,
      todo3
      }
      })

      //把这个小仓库暴露出去
      export default store
  • 然后编写一个个模块,这些模块组成一整个store

    • 在modules目录下建立todo1.js

    • 1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
          const state = {
      todos: [] //这是我们的数据或状态
      }

      const getters = { //可以认为是计算属性,返回值会被缓存
      getAllTodos (state, num) { //第一个参数必须是state,其他的可以自己加
      return state.todos[0] + num //这种情况直接返回了一个值,所以结果会被缓存
      },
      getTodoById (state) {
      return (id) => state.todos.find(todo => todo.id === id)
      } //这种情况返回的是一个函数,每次都会被调用所以不会缓存结果,要注意
      }

      const mutations = { //更改state的唯一方法
      todosPush (state, num) { //调用时得用store.commit('todosPush', 123)
      state.todos.push(num)
      }
      }

      const actions = {
      todosPush ({ commit }) { //注意:1、actions里的方法第一个参数是跟store具有相同属性和方法的context对象。2、actions里的方法都通过store.dispatch('todospuah')触发
      commit('todospush', 123)
      }
      }
  • 未完待续。。。
# vuejs, vuex

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×

// tidio机器人助手