美文网首页Vue.js前端开发笔记
004-vuex强制对state进行赋值发生什么?

004-vuex强制对state进行赋值发生什么?

作者: kyo_f89f | 来源:发表于2019-02-27 13:17 被阅读0次

或许我们从来都没有这么弱鸡的想法,因为在使用vuex时一般通过action触发mutation再操作store。那么如果真这样子操作会怎么样呢?

this.$store.state = {count: 100}

强制对state进行发生什么?
如果在开发环境,控制台会报错并提示我们:"Error: [vuex] use store.replaceState() to explicit replace store state."
也就是说vuex并不允许我们直接对state进行赋值,好奇vuex是如何办到了呢?

先看这段代码:

class Store {
}

let store = new Store()
store.state = {count: 100}
console.log(store.state) //=> {count: 100}

相信这段代码没有什么问题,就是一个赋值,一个取值打印,接下对这段代码修改一下

class Store {
  constructor () {
    this._state = {}
  }
  get state () {
    return this._state
  }
  set state (v) {
    console.log('不要对state直接进行赋值')
  }
}

let store = new Store()
store.state = {count: 100} // 控制台就会打印 "不要对state直接进行赋值"

所先在实例化的时候this._state = {},然后取state 的时候返回this._state,set的时候就屏蔽掉,不允许操作。对,vuex就是这样子。

如果我们不直接操作state,而是对他下的属性进行添加属性呢?

class Store {
  constructor () {
    this._state = {}
  }
  get state () {
    return this._state
  }
  set state (v) {
    console.log('不要对state直接进行赋值')
  }
}

let store = new Store()

store.state.count = 100
console.log(store.state) //=> {count: 100}

这时候能正常赋值了,它的本质是拿到store.state,他实际上引用的是this._state,然后对这个对象添加属性。我们回到vuex

this.$store.state.count = 100

vuex同样对state添加属性同样是可以的,但是这样子的操作vue-devtool就无法监听了。

最后分享一下vuex里面的源码:

  get state () {
    return this._vm._data.$$state // state 藏身在此
  }

  set state (v) {
    // 如果是开发环境就提示信息
    if (process.env.NODE_ENV !== 'production') {
      assert(false, `use store.replaceState() to explicit replace store state.`)
    }
  }

相关文章

  • 004-vuex强制对state进行赋值发生什么?

    或许我们从来都没有这么弱鸡的想法,因为在使用vuex时一般通过action触发mutation再操作store。那...

  • js 完全复制一个 数组, 而非引用复制

    在 React 中对 state 数组数据的处理, 不要直接引用赋值, 而要完成复制赋值因为直接修改 state ...

  • react的props和state的区别

    props用于定义外部接口,state用于记录内部状态 props的赋值在于外部世界使用组件,state的赋值在于...

  • React边学边记

    **1. 组件 ** **2. state ** state 不能直接赋值,比如以下的代码 : state是异步的...

  • es6-解构赋值

    什么是解构赋值 左右一一对应进行赋值。 解构赋值的分类 数组解构赋值,左右都是数组 对象解构赋值,左右都是对象 字...

  • es6解构赋值(数组解构)

    解构赋值什么是解构赋值左边和右边一一对应进行赋值解构赋值的分类数组解构赋值(重点) 对象解构赋值(重点)字符串解构...

  • 【ReactJS】关于 setState()你需要知道的三件事

    学习记录参考state: 状态 1.不要直接修改state 唯一能给state赋值的就是构造器 2.更新state...

  • ES6学习(2)解构赋值

    什么是解构赋值 ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构赋值; 解构赋值属于浅...

  • ES6的解构赋值

    一、前言 什么是“解构赋值”呢?就是从数组或者对象中取值,对变量进行赋值,这就是变量的解构赋值。 二、数组的解构赋...

  • ES6 解构赋值

    解构赋值是对赋值运算符的扩展。是一种针对数组或者对象进行模式匹配,然后对其中的变量进行赋值。 数组的解构赋值 ES...

网友评论

    本文标题:004-vuex强制对state进行赋值发生什么?

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