vue源码中mvvm.js

本文探讨了MVVM的运行机制,通过图表和DOM结构展示其核心概念。文章重点介绍了如何在MVVM实例中结合Vue2的Object.defineProperty数据劫持和Vue3的proxy数据代理,实现数据的双向绑定。
摘要由CSDN通过智能技术生成
MVVM运行机制图:

在这里插入图片描述

dom结构

<div id="app">
	<p>{{name}}</p>
</div>
mvvm实例
var vm = new MVVM({
        el: '#app',
        data: {
            name:'张三'
        }
    });
mvvm实例不仅采用了vue2中的Object.defineProperty()进行数据劫持和结合发布订阅者模式来实现数据的双向绑定,而且也采用了vue3的proxy数据代理
//mvvm.js
function MVVM(pick) {
    //给实例新增一个$pick属性,.并且把传递过来的数据进行暂存,防止在回调函数或者闭包中找不到原来的mvvm实例
    this.$pick = pick;
    this.$pick.beforeCreate && this.$pick.beforeCreate();

    //在实例上新增一个_data 保存传递过来的data数据
    var data = this._data = this.$pick.data;

    //保存this 为了之后使用this的时候保证this指向的正确性
    var they = this;

    //通过Object.keys取出data中每一项数据的属性名,然后遍历调用_proxy方法
    Object.keys(data).forEach(function(key) {
        // 数据代理
        they._proxy(key);
    });
    this.$pick.created && this.$pick.created();

    //为data所有数据进行劫持 结合订阅发布模式
    observe(data, this);

    //解析模版===> #app 或者 <div></div>
    this.$compile = new Compile(pick.el || document.body, this)
}

MVVM.prototype = {
    $watch: function(key, cb, pick) {
        new Watcher(this, key, cb);
    },

    _proxy: function(key) {//实现数据代理
        var they = this;//暂存this即mvvm实例

        //通过defineProperty方法在mvvm实例上(新增/或者)修改所有与data中属性所对应属性,并且为该属性添加get和set方法
        Object.defineProperty(me, key, {//vm.name
            configurable: false,
            enumerable: true,
            get: function proxyGetter() {
                //实现了vm代理data中数据的读操作
                return they._data[key];
            },
            set: function proxySetter(val) {//这是一个回调函数,主要式监听每个属性值并改变对应的数据
                //mvvm实例代理了data内的数据修改和新增。
                they._data[key] = val;
            }
        });
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kero是一个用于扩展MVVM架构数据模型的JS类库,实现了数据和UI的双向绑定,帮助开发者快速构建数据驱动型应用,解决复杂数据交互问题。Kero 做为 MVVM 架构 Model 层的增强,主要功能有:以行、列的形式对数据做存储,并对外暴露一批增删改查的API,方便开发者对页面数据的处理,而且所有开发者之间做到统一,减少出错概率。数据增加状态标识新增或修改,方便开发者使用。具有分页缓存能力,可在前台处理分页(非必要情况下,不推荐前台分页)。具有事件触发器,把数据变化触发出去,供开发者监听使用。目录说明:├─css 控件css ├─dist 产出后的资源 ├─docs 文档相关 ├─examples 示例文件     ├─datatable 关联datatable示例     ├─ui 单独控件示例 ├─snippets 文档及代码片段     ├─docs 文档片段     │  ├─grid.md 文档片段:replaceui将替换为ui示例,replacedatatable将替换为datatable示例。     └─examples 示例片段         └─grid 与grid.md对应的目录,示例目录下必须存在widget.css,widget.html,widget.js,说明.txt             └─datatable 关联datatable示例片段             └─ui 单独控件示例片段 ├─vendor 第三方库,后续删除 ├─app.js 依据snippets的片段生成docs以及examples的最终产出 ├─gulpfile.js 通过gulp对项目源文件(CSS/JS)生成dist的最终产出 ├─package.json node说明 └─README.md 项目说明 标签:Kero
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值