数据响应式之Proxy受虐式

前言

回首前章也是有写过vue双向绑定的,基于Object.defineProperty() ,那是自己一句一句代码撸出来的,查看了各种文章 去看看

然后 :
一场公开课被虐到无地自容 , 大佬的 proxy 版本,话不多说 ,直接上代码,分享给大家欣赏一下 。

HTML
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>响应式数据</title>
    <script>
		class vue extends EventTarget{
		    constructor(option){
		        super();
		        this.option = option;
		        this.$data = this.option.data;
		        this.$el = document.querySelector(this.option.el);
		        this.observe(this.$data);
		        this.compileNode(this.$el);
		    }
		
		    observe(data){
		        let _this = this;
		        this.$data = new Proxy(data,{
		            set(target,prop,newValue){
		                let event = new CustomEvent(prop,{
		                    detail:newValue
		                });
		                _this.dispatchEvent(event);
		                return Reflect.set(...arguments);
		            }
		        });
		    }
		
		    compileNode(el){
		        let child = el.childNodes;
		        [...child].forEach(node=>{
		            if(node.nodeType === 3){
		                // console.log('这是一个文本节点');
		                let text = node.textContent;
		                let reg = /\{\{\s*([^\s\{\}]+)\s*\}\}/g;
		                if(reg.test(text)){
		                    let $1 = RegExp.$1;
		                    this.$data[$1] && (node.textContent = text.replace(reg,this.$data[$1]));
		
		                    this.addEventListener($1,e=>{
		                        node.textContent = text.replace(reg,e.detail)
		                    });
		                }
		            }else if(node.nodeType === 1){
		                let attr = node.attributes;
		                if(attr.hasOwnProperty('v-model')){
		                    let keyName = attr['v-model'].nodeValue;
		                    node.value = this.$data[keyName];
		                    node.addEventListener('input',e=>{
		                        this.$data[keyName] = node.value;
		                    })
		                }
		
		                this.compileNode(node);
		            }
		        })
		    }
		}
	</script> 
</head>
<body>

<div id="app">
    {{name}}
    <div>{{message}}</div>
   {{message}} <input v-model="test"> {{test}}
</div>

<script>
    let vm = new vue({
        el:'#app',
        data:{
            name:'hisen',
            message:'测试数据',
			test:'请输入'
        }
    })
</script>

</body>
</html>
课程介绍本套课程,大喵将带着大家手把手,编辑每一行代码,使用原生Javascipt及ES6的一些新特性,仿照目前国内非常流行的Vue框架的源码,开发构建一个属于你们自己的MVVM框架。让大家能够很清晰的学习及掌握,模板编译,数据绑定,响应式,文档碎片,观察者模,发布订阅模等等,这些Vue的核心知识点,都是怎么回事,它们之间有哪些关联,是如何进行双向数据绑定的等等。在使用vue2.x的核心Object.defineProperty构建完成框架后,大喵也会使用Vue3.0引入的数据劫持的Proxy新特性,来改造我们的MVVM框架,提升我们的框架性能。最终,大喵会手把手带着大家,从0开始配置webpack.config.js配置文件以及引入babel-loader,配置.babelrc文件,转换我们JS文件中的的ES6语法,最终压缩输出我们的MVVM框架库文件。课程目录01 手把手搭建MVVM框架 课程介绍、02 文件结构及基础类创建、03 入口类DamiaoMvvm的实现、04 模板编译、05 元素节点解析编译、06 v-model 数据绑定逻辑梳理、07 v-model 数据绑定实现、08 模板文本编译逻辑梳理、09 模板文本渲染绑定、10 观察者Wather逻辑梳理、11 Wather 逻辑实现、12 Object.defineProperty()、13 defineProperty 小案例、14 observer数据劫持梳理、15 defineProperty数据劫持实现、16 发布订阅类实现、17 Proxy 介绍与概述、18 使用Proxy改造MVVM框架、19 使用Proxy实现响应式、20 webpack 打包配置、21 babel 配置及文件输出、22 Mvvm Proxy 框架打包、23 Mvvm 框架搭建课程总结MVVM框架介绍MVVM是 Model-View-ViewModel 的缩写。mvvm是一种设计思想。Model 层代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑;View 代表UI 组件,它负责将数据模型转化成UI 展现出来,ViewModel 是一个同步View 和 Model的对象。在MVVM架构模下,View 和 Model 之间并没有直接的联系,而是通过ViewModel进行交互,Model 和 ViewModel 之间的交互是双向的, 因此View 数据的变化会同步到Model中,而Model 数据的变化也会立即反应到View 上。ViewModel 通过双向数据绑定把 View 层和 Model 层连接了起来,而View 和 Model 之间的同步工作完全是自动的,无需人为干涉,因此开发者只需关注业务逻辑,不需要手动操作DOM, 不需要关注数据状态的同步问题,复杂的数据状态维护完全由 MVVM 来统一管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值