数据响应式 - 数据劫持 / defineProperty / mvvm模式

数据劫持 / defineProperty / mvvm模式

数据响应式: 是指当数据改变后,会通知到使用该数据的代码
例如: 视图渲染中依赖的数据,数据发生改变的时候,视图也自动更新

数据劫持

模拟vue 中的双向数据绑定实现原理( 基于数据劫持实现的 )
需要在 设置 / 获取 数据对象属性的同时,做些其他的事情

  • $ + 属性名
    加$ 表示其他名字即便重名也不能覆盖 该变量名

	let obj1 = {
    	// 加$ 表示其他名字即便重名也不能覆盖 该变量名
    	// 但是没有私有的意思
        $point : "爱好",
        get point(){
	        console.log("我得到了point")
	        return this.$point
        },
        set point(val){
	        console.log("拿到了新的point数据" + val )
	        return this.$point = val;
        }
	}
	
	console.log(obj1.point) // => 爱好
	
	// 设置属性值,同时触发 console
    obj1.point = "厌恶"; // => 拿到了新的point数据 厌恶
    
    // 同时输出两个内容 (查看值是否被修改)
    console.log(obj1.point); // => 我得到了point 
    						 // => (获取对象属性值,并没有被修改)爱好
    

defineProperty

基于Object去调用

  • get 是一种获得属性值的方法,负责查询值,它不带任何参数
  • set是一种设置属性值的方法,负责设置键值,值是以参数的形式传递
  • 参数设置 Object.defineProperty ( obj , “name” , { } )
    obj : 指定的操作对象
    "name" : 指定对象的指定属性(这里可以是已有的属性值。也可以是新来的,用做添加新属性)
    { } : 对指定属性的 相关设置
	Object.defineProperty(obj,"name",{
		//1. 配置是否允许被删除 true(默认)可以被删除,false 不可以删除
        //  允许增删
        configurable : true,
		//2. 配置是否允许被枚举 true(默认)可以被遍历,false 不可以遍历
        // 是否允许被枚举  ===  是否允许被遍历访问
        enumerable : true,
		//3. 配置是否允许被修改,true ( 默认值 ) 允许, false 不允许
        // 默认值为 true,没有业务需要,不需要设置
        
		// writable 会对set方法造成影响: 默认值 true 时(不填写,即为默认) 没有影响
        //               设置为 true 时, 发生冲突
        // writable: false
        
		//4. value: 本身就存在,用于指定属性的赋值,获取 默认为 undefined
        // 自身自带value 值
        set(newVal){
        	console.log("设置的新值" + newVal)
            //  允许增删
            // configurable : true
            // 否则 不能使用 value
            value = newVal;
		},
        get(){
			return value // value 本身就存在
        }
	})
	
	delete obj.name; // 修改 configurable 属性 查看不同的结果
    console.log(obj.name)

数据实时改变
  • 前端html准备
    
    <input type="text" id="ipt">
    <div class="cl"></div>
    
  • 后端JS代码

	let obj = {
		name : "秦",
		age : 24
	}
	
	// 省略 ... Object.defineProperty(obj,"name",{配置信息})
	
	let ipt = document.querySelector("#ipt");
	let c = document.querySelector(".cl");
	  
	ipt.onchange = function(){
		console.log("数据改变"+ ipt.value)
		console.log(ipt.value)
		obj.name = ipt.value;
		c.innerHTML = obj.name;
	}
	

mvvm模式

遵循的基本原则: 数据驱动视图的方式

  • mvc 模式
    之前的市面是很常见很流行的一个概念,一个编程规范。
  • mvvm 模式
    model(模型-数据) + view(视图) + viewModel(视图模型)
    可以看作是 mvc 的升级版
    本质上,就是mvc的改进版,mvvm 就是将其中的 view的状态和行为 抽象化
    ViewModel 的任务:将视图和数据区分开,并通过vm来建立连接
    它可以取出 model 中的数据,同时帮忙处理 view 中需要展示的内容所需的业务逻辑
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
课程介绍本套课程,大喵将带着大家手把手,编辑每一行代码,使用原生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、付费专栏及课程。

余额充值