vuex中store中的state是如何定义出来的?

发布于 2022-09-11 23:50:01 字数 165 浏览 65 评论 0

image.png
各位大佬们,之前也没看到Object.defineProperty(store, 'state')这个操作,想问下new Store以后,改方法第一行中this为什么会出现state这个字段?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

离去的眼神 2022-09-18 23:50:01

vuex源码中使用了es6中class的get和set定义state

 get state () {
    return this._vm._data.$state
  }

  set state (v) {
    if (process.env.NODE_ENV !== 'production') {
      assert(false, `use store.replaceState() to explicit replace store state.`)
    }
  }

你的代码应该是经过es6转es5了吧,转出来应该是下面的代码

Store.prototype = {
  get state () {
    return this._vm._data.$state
  }

  set state (v) {
    if (process.env.NODE_ENV !== 'production') {
      assert(false, `use store.replaceState() to explicit replace store state.`)
    }
  }
 }
梦亿 2022-09-18 23:50:01

看了上一个回答的评论,其实在installModule函数里,有一块代码是注册state

class Store{
    constructor (options = {}) {
        // init root module.
        // this also recursively registers all sub-modules
        // and collects all module getters inside this._wrappedGetters
        installModule(this, state, [], this._modules.root)
    }

}
function installModule(){
    // ... 省略代码
    // set state
    // 不是根模块且不是热重载
    if (!isRoot && !hot) {
      // 获取父级的state
      const parentState = getNestedState(rootState, path.slice(0, -1))
      // 模块名称
      // 比如 cart
      const moduleName = path[path.length - 1]
      // state 注册
      store._withCommit(() => {
        // 省略代码:非生产环境 报错 模块 state 重复设置
        Vue.set(parentState, moduleName, module.state)
      })
    }
    // ... 省略代码
}

刚好之前写过一篇vuex源码解析的文章,你可以看看,并且断点调试一下,你就能解答你自己的这个问题了。
思否:学习 vuex 源码整体架构,打造属于自己的状态管理库
个人博客:学习 vuex 源码整体架构,打造属于自己的状态管理库这个阅读链接可能阅读体验更好些

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文