美文网首页
手写一个Vuex(一)

手写一个Vuex(一)

作者: 米苏森林 | 来源:发表于2020-05-12 12:03 被阅读0次

手写一个Vuex,命名为myVuex,替换Vuex的引入,其他使用方法不变。如下内容:

import Vue from 'vue';
import myVuex from '../myVuex';
Vue.use(myVuex);

let store = new myVuex.Store({
    state: {
        pageSize: 12,
        test: '',
        ttt: ''
    },
    // commit
    mutations: {
        isCommit(state, val) {
            state.test = val
        }
    },
    // dispatch
    actions: {
        isDispatch(state, val) {
            state.ttt = val
        }
    }
})

export default store;

首先,先创建myVuex文件夹与store文件夹同级
然后,myVuex文件夹中创建index.js, 由于需要支持Vue.use和new myVuex.Store方法,(Vue.use需要用到install,后面会介绍;)所以暴露的Vuex需要如下内容:

index.js:
let Vuex = {
    install: install,
    Store: store,
    version: '3.1.3'
}

export default Vuex

接下来我们先实现Vue.use(myVuex),我们先分析一下Vue.use具体做了什么操作,源码如下:
最主要就是调用了插件的install方法或自身。

export function initUse(Vue: GlobalAPI) {
  Vue.use = function (plugin: Function | Object) {
    const installedPlugins = (this._installedPlugins || (this._installedPlugins = []))
    if (installedPlugins.indexOf(plugin) > -1) {
      return this
    }

    // additional parameters
    const args = toArray(arguments, 1)
    args.unshift(this)
    // 调用install方法或自身
    if (typeof plugin.install === 'function') {
      plugin.install.apply(plugin, args)
    } else if (typeof plugin === 'function') {
      plugin.apply(null, args)
    }
    installedPlugins.push(plugin)
    return this
  }
}

所以,我们myVuex中需要增加install方法,如下:

var install = function install(Vue) {
    console.log(Vue)
    console.log(this) // 此處this是Vuex
    // 需判断是否存在Vue

    applyMixin(Vue)
}

function applyMixin(Vue) {
    // 将vuexInit方法混淆到beforeCreate中,因此每个.vue页面创建的时候都会去调用vuexInit
    // 所以每个页面都可以使用this.$store进行访问
    Vue.mixin({ beforeCreate: vuexInit });
}

// 实现this.$store的使用
function vuexInit() {
    console.log(this) // 此處this是Vue
    var options = this.$options;

    if (options.store) { // 说明是根节点
        this.$store = options.store
    } else {
        this.$store = options.parent.$store
    }
}

接着我们讲解store,新建store.js文件,专门处理store内容:

var Store = function Store(options) {
    console.log(this) // Store本身
    let keys = Object.keys(options);
    for (let item of keys) {
        this[item] = options[item]
    }
}

// prototype属性指向构造函数创建的实例的原型对象,即Store.prototype === new Store().__proto__
Store.prototype.commit = function commit(type, payload) {
    this.mutations[type].call(this, this.state, payload)
}

Store.prototype.dispatch = function dispatch(type, payload) {
    this.actions[type].call(this, this.state, payload)
}

export default Store;

未解决问题:
store的数据双向绑定, 后续完善。

相关文章

  • Vuex源码解析

    手写vuex核心代码 vuex基本用法 分析 我们是通过new Vuex.store(option)获得一个sto...

  • 手写一个Vuex(一)

    手写一个Vuex,命名为myVuex,替换Vuex的引入,其他使用方法不变。如下内容: 首先,先创建myVuex文...

  • 手写简单Vuex

    手写 vuex 插件固定写法 混入 创建 Store 由于需要使用 new Vuex.Store 来创建,所以 V...

  • 手写简单Vuex

    Vuex Vuex 集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以可预测的方式发生变化。 核心概念 ...

  • 手写Vuex源码

    Vuex源码实现 1. Vuex核心概念State,Getters,Mutations, Actions, Mod...

  • Vuex(三) —— 纯手写一个超简单的Vuex

    目录 分析Vuex的功能 下载模板 分析模块结构 实现install函数 实现Store类 替换vuex 前面学了...

  • 手写 Vuex 4.x

    Vuex是官方提供的状态管理库,为了深入了解它的实现逻辑,本文我们一起来一步步实现它。 初始化 用法 代码实现 s...

  • Vuex的使用

    使用Vuex 1、安装vuex 2、src目录下面新建一个vuex的文件夹3、vuex 文件夹里面新建一个stor...

  • Vue学习笔记-Vuex介绍

    一、什么是vuex[https://vuex.vuejs.org/zh/]? Vuex 是一个专为 Vue.js ...

  • vuex 使用教程

    vuex简介 vuex相当于一个浏览器的一个本地存储,不过vuex拥有更复杂的操作,vuex包含了数据定义,数据过...

网友评论

      本文标题:手写一个Vuex(一)

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