手写简单Vuex

手写 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 中实现一下

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Vuex Vuex 集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以可预测的方式发生变化。 核心概念 ...
    Betterthanyougo阅读 1,630评论 0 1
  • ### store 1. Vue 组件中获得 Vuex 状态 ```js //方式一 全局引入单例类 // 创建一...
    芸豆_6a86阅读 4,044评论 0 3
  • 安装 npm npm install vuex --save 在一个模块化的打包系统中,您必须显式地通过Vue.u...
    萧玄辞阅读 8,043评论 0 7
  • Vuex学习 一、Vuex是做什么的? 官方解释:Vuex是一个专为Vue.js应用程序开发的状态管理模式,它采用...
    waigo阅读 2,415评论 0 0
  • Vuex状态管理 组件状态管理及组件间通信回顾 状态管理 状态集中管理和分发,解决多个组件共享状态的问题 状态自管...
    彪悍de文艺青年阅读 3,262评论 0 0

友情链接更多精彩内容