通俗易懂了解并实现 vuex 原理

Vuex是什么?

官方解释:vuex是一个专门为vue.js应用程序开发的状态管理模式。他采用 集中式存储管理应用的所有组件的状态,这个状态管理包括了以下几个部分:

  • state:驱动应用数据源
  • view,以声明方式将 state 映射到视图中
  • actions 响应vue上的用户输入导致的状态变化

官方的 ‘单项数据流’理念的简单示意:
在这里插入图片描述
每一个vuex应用的核心就是 store(仓库),store基本上就是一个容器,包含着你应用的大部分的状态(state)

看图了解一下工作的原理
在这里插入图片描述
注意点:

  • 改变状态的唯一途径 提交mutations
  • 如果是异步的就派发(dispath)actions,本质还是提交mutations
  • 触发actions可以用组件 components使用 dispath 来触发
  • 提交mutations之后可以动态渲染组件 vue components

原理的实现


	// 声明一个 veu 当使用Vue.use的时候给Vue赋值
	let Vue;
	// 封装这个函数是重写配置传来的值 所以我们封装一下
const forEach = (obj, callback) => {
    Object.keys(obj).forEach((key) => {
        callback(key, obj[key])
    })
}
	//定义一个类
	class Store{
		// 通过构造函数传来的值进行配置
		constructor(options){
			// state使用 vue 来创建一个双向绑定
			this._s = new Vue({
				data:{
					state:options.state	
				}
			})
		// 得到配置上的getters 如果没有就默认为空
		let getters = options.getters || {}
		this.getters = {}
		//把getters里面的配置项 绑定到 this.getters
		forEach(getters,(key,value)=>{
			  /* 
            这里的key和值就是
              gettrers: {
                add: function (state, payload) {
                }
            },
            key 就是add 函数就是value
            */
             Object.defineProperty(this.getters, key, {
                get() {
                    return value(this.state)
                }
            })
		})
	 // 得到配置上的mutations 如果没有就默认为空 类似以上面的方法
	 let mutations = options.mutations || {}
        this.mutations = {}
        forEach(mutations, (key, value) => {
            this.mutations[key] = (payload) => {
                console.log(value)
                value(this.state, payload)
            }
        })
        //  得到配置上的actions 如果没有就默认为空
        let actions = options.actions || {}
        this.actions = {}
        forEach(actions, (key, value) => {

            this.actions[key] = (payload) => {
                console.log(value)
                value(this, payload) //action是传入store
            }
        })
		}
    // dispatch和commit的实现
    dispath(type, payload) {
        this.actions[type](payload)

    }
    commit(type, payload) {
        this.mutations[type](payload)
    }
    get state() {
        return this._s.state
    }
	}

	// 使用 Vue.use就会触发这个函数
	function install(v){
	 // 获取Vue框架
		Vue = v
	// 通过全局的混入模式来给所有的组件添加$store
	Vue.mixin({
		beforeCreate(){
			//判断当前是否为跟组件 如果是跟组件就把跟组件的store赋值
			if(this.$options && this.$options.store){
				this.$store = this.$options.store
			}else {
			 	//找他的父级
			 	this.$store = this.$parent && this.$parent.$store
			 }
		}
	})
	}

		// 最后导出去
		export defalut {
			install,
			Store	
		}

使用直接把导入的Vuex改成自己写的js文件即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值