美文网首页
手写简单Vuex

手写简单Vuex

作者: 南枫小谨 | 来源:发表于2021-05-16 18:32 被阅读0次

手写 vuex

插件固定写法

let Vue = null
const install=(v)=>{
    Vue = v

}
export default{
    install
}

混入

const install=(v)=>{
    Vue = v
    Vue.mixin({// 混入 以后子组件都可以使用$store 访问 
        beforeCreate() {
            //判断是否为根节点,根节点会挂载store
            if(this.$options && this.$options.store){
                this.$store = this.$options.store
            }else{
                this.$store = this.$parent && this.$parent.$store
            }
        },
    })

}

创建 Store

由于需要使用 new Vuex.Store 来创建,所以 Vuex 中要包含Store

class Store{
    constructor(options){
        
    }
}

如何实现响应式

可以借助vue 响应式来实现 创建一个vue 实例,将store 放在data 方法中

class Store{
    constructor(options){
        this.vm = new Vue({
            data:{
                state:options.state
            }
        })

    }
    get state(){
        return this.vm.state
    }

}

实现getter

    let getters = options.getters || {}
    this.getters = {}
    Object.keys(getters).forEach(getName=>{
        Object.defineProperty(this.getters,getName,{
            get:()=>{return getters[getName](this.state)}
        })
    })   

实现mutations commit

    let mutations = options.mutations || {}
    this.mutations = {}
    Object.keys(mutations).forEach(mutationName=>{
        this.mutations[mutationName] = payload=>{
            mutations[mutationName](this.state,payload)
        }
    })  
    commit = (method, payload) => {
        this.mutations[method](payload)
    }    

实现 actions dispatch

    let actions = options.actions || {}
    this.actions = {}
    Object.keys(actions).forEach(actionName => {
        this.actions[actionName] = payload => {
            actions[actionName](this, payload)
        }
    })
    dispatch = (method, payload)=>{
        this.actions[method](payload)
    }

完整代码

let Vue = null
class Store {
    constructor(options) {
        this.vm = new Vue({
            data(){
                return  {
                state: options.state
            }
            }
        })
        let getters = options.getters || {}
        this.getters = {}
        Object.keys(getters).forEach(getName => {
            Object.defineProperty(this.getters, getName, {
                get: () => { return getters[getName](this.state) }
            })
        })

        let mutations = options.mutations || {}
        this.mutations = {}
        Object.keys(mutations).forEach(mutationName => {
            this.mutations[mutationName] = payload => {
                mutations[mutationName](this.state, payload)
            }
        })
        let actions = options.actions || {}
        this.actions = {}
        Object.keys(actions).forEach(actionName => {
            this.actions[actionName] = payload => {
                actions[actionName](this, payload)
            }
        })

    }
    commit = (method, payload) => {
        this.mutations[method](payload)
    }
    dispatch = (method, payload)=>{
        this.actions[method](payload)
    }

    get state() {
        return this.vm.state
    }

}

const install = (v) => {
    Vue = v
    Vue.mixin({// 混入 以后子组件都可以使用$store 访问 
        beforeCreate() {
            //判断是否为根节点,根节点会挂载store
            if (this.$options && this.$options.store) {
                this.$store = this.$options.store
            } else {
                this.$store = this.$parent && this.$parent.$store
            }
        },
    })

}
export default {
    install,
    Store
}

简单来讲就是将const store = new Vuex.Store({
.....
})内部传递的参数在 Vuex 中实现一下

相关文章

  • 手写简单Vuex

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

  • 手写简单Vuex

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

  • Vuex源码解析

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

  • 手写Vuex源码

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

  • 手写一个Vuex(一)

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

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

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

  • 通过一个简单实例了解vuex

    简单说明 什么是vuex,vuex怎么使用,什么场景下适合使用vuex, vuex 文档中都有介绍。看完文档之后,...

  • 前端数据流之vuex

    从前整理过vuex,这篇是补充 最简单的vuex 多个组件共享状态时的vuex 初始化 vue create vu...

  • vue状态管理vuex

    一、vuex的简单介绍 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式,简单的来说作用是:可以简单...

  • vuex的简单应用01

    二、简单的从store中取值 三、简单的改变vuex中的值 三.1 简单的改变vuex中的值--传递一个参数 三....

网友评论

      本文标题:手写简单Vuex

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