ArthurWangCN / notepad

reading notepad
0 stars 2 forks source link

Vue2.x:Vuex #22

Open ArthurWangCN opened 2 years ago

ArthurWangCN commented 2 years ago

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

ArthurWangCN commented 2 years ago

Vuex 原理

ArthurWangCN commented 2 years ago

Vuex中action和mutation的区别

mutation中的操作是一系列的同步函数,用于修改state中的变量的的状态。当使用vuex时需要通过commit来提交需要操作的内容。mutation 非常类似于事件:每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler)。这个回调函数就是实际进行状态更改的地方,并且它会接受 state 作为第一个参数:

const store = new Vuex.Store({
  state: {
    count: 1
  },
  mutations: {
    increment (state) {
      state.count++      // 变更状态
    }
  }
})

当触发一个类型为 increment 的 mutation 时,需要调用此函数:

store.commit('increment')

而Action类似于mutation,不同点在于:

const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment (state) {
      state.count++
    }
  },
  actions: {
    increment (context) {
      context.commit('increment')
    }
  }
})

Action 函数接受一个与 store 实例具有相同方法和属性的 context 对象,因此你可以调用 context.commit 提交一个 mutation,或者通过 context.state 和 context.getters 来获取 state 和 getters。

所以,两者的不同点如下:

ArthurWangCN commented 2 years ago

Vuex 和 localStorage 的区别

(1)最重要的区别

(2)应用场景

(3)永久性

刷新页面时vuex存储的值会丢失,localstorage不会。

注意: 对于不变的数据确实可以用localstorage可以代替vuex,但是当两个组件共用一个数据源(对象或数组)时,如果其中一个组件改变了该数据源,希望另一个组件响应该变化时,localstorage无法做到,原因就是区别1。

ArthurWangCN commented 2 years ago

Redux 和 Vuex 有什么区别

ArthurWangCN commented 2 years ago

为什么要用 Vuex 或者 Redux

由于传参的方法对于多层嵌套的组件将会非常繁琐,并且对于兄弟组件间的状态传递无能为力。我们经常会采用父子组件直接引用或者通过事件来变更和同步状态的多份拷贝。以上的这些模式非常脆弱,通常会导致代码无法维护。

所以需要把组件的共享状态抽取出来,以一个全局单例模式管理。在这种模式下,组件树构成了一个巨大的"视图",不管在树的哪个位置,任何组件都能获取状态或者触发行为。

另外,通过定义和隔离状态管理中的各种概念并强制遵守一定的规则,代码将会变得更结构化且易维护。

ArthurWangCN commented 2 years ago

Vuex有哪几种属性?

有五种,分别是 State、 Getter、Mutation 、Action、 Module

ArthurWangCN commented 2 years ago

Vuex和单纯的全局对象有什么区别?

ArthurWangCN commented 2 years ago

为什么 Vuex 的 mutation 中不能做异步操作?

ArthurWangCN commented 2 years ago

Vuex的严格模式是什么,有什么作用,如何开启?

在严格模式下,无论何时发生了状态变更且不是由mutation函数引起的,将会抛出错误。这能保证所有的状态变更都能被调试工具跟踪到。

在Vuex.Store 构造器选项中开启,如下

const store = new Vuex.Store({
    strict:true,
})