zoukankan      html  css  js  c++  java
  • vue双向绑定原理

    vue双向绑定原理的核心

    它的实现的核心是通过Object.defineProperty(),对data的每个属性进行了get、set的拦截。
    其实只用Object.defineProperty()已经可以实现双向绑定,只是这样做效率非常低。

    观察者模式

    观察者模式在双向绑定当中是什么角色呢?
    观察者模式让双向绑定更有效率
    为什么观察者模式让双向绑定更有效率?
    观察者模式,它是一对多的一种模式,在vue里面,“一”是改了某一个data数据,“多”是页面上凡是用了这个数据的地方,都更新。这就是页面上的很多“地方”,都观察者这个data,这就是一对多的关系,所以用观察者模式。

    Object.defineProperty()

    Object.defineProperty()有三个参数:
    1.属性所在的对象
    2.要操作的属性
    3.被操作的属性的特性,参数格式是对象{},一般是两个,
    get:读取属性时触发;
    set:写入属性时触发;
    Object.defineProperty()基本使用代码演示:

    <script>
    	var obj = {}
    	Object.defineProperty(obj,'property',{
    		get:function(){
    			console.log('读取数据时触发了get')
    			return 'get的返回值'
    		},
    		set:function(){
    			console.log('写入时触发了set')
    		}
    	});
    
    	// 写入时触发set,属性赋值就是写入
    	obj.property = 123;
    
    	// 读取时触发get
    	console.log(obj.property);
    </script>
    

    这时控制台输出

    极简版的双向绑定:实现input标签输入内容与p标签内容同步

    <h1>极简版的双向绑定</h1>
    <input type="text" id="txt_id"/>
    <p id="p_id"></p>
    
    <script>
    	var obj = {}
    	Object.defineProperty(obj,'property',{
    		get:function(){
    			console.log('读取数据时触发了get')
    			return 'get的返回值'
    		},
    		set:function(inputValue){
    			// console.log(inputValue)
    			document.getElementById('txt_id').value=inputValue;
    			document.getElementById('p_id').innerHTML=inputValue;
    		}
    	});
    // 光标、焦点在input输入框里,监听keyup事件
    	document.addEventListener('keyup',function(e){
    		// console.log(e.target.value)
    		obj.property = e.target.value;
    	});
    </script>
    

    运行结果:

    数据劫持是什么意思?
    就是通过Object.defineProperty,去操作数据的get、set
    数据劫持: vue.js 则是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。

    参考文献:剖析Vue原理&实现双向绑定MVVM

  • 相关阅读:
    FindWindowEx
    c# 基础知识
    propertychange 属性说明
    Python3-2020-测试开发-22- 异常
    Python3-2020-测试开发-21- 面向对象之封装,继承,多态
    Python3-2020-测试开发-20- Python中装饰器@property
    Python3-2020-测试开发-19- Python中私有属性和私有方法
    Python3-2020-测试开发-18- Python中方法没有重载
    Python3-2020-测试开发-17- 类编程
    Python3-2020-测试开发-16- 嵌套函数(内部函数 )&nonlacal声明外部函数的局部变量&LEGB规则
  • 原文地址:https://www.cnblogs.com/songsongblue/p/12580508.html
Copyright © 2011-2022 走看看