VUE双向绑定原理_vue的数据绑定怎么实现

VUE双向绑定原理_vue的数据绑定怎么实现烂大街原理:数据劫持+发布订阅者模式(obect.defineProperty())……..(此处省略8888个字节)。话不多说上代码HTML:<divid=”app”> <div> <divv-text=”myText”></div> <divv-text=”myBox”></d…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

烂大街原理:数据劫持+发布订阅者模式 (obect.defineProperty())……..(此处省略8888个字节)。

话不多说上代码

HTML:

<div id="app">
	<div>
	    <div v-text="myText"></div>
	    <div v-text="myBox"></div>
		<input type="text" v-model="myText">
	</div>
</div>

JS:仿vue数据初始化

const app = new Vue({
	el:'#app',
	data:{
		myText:'数据响应式',
		myBox:'我是一个盒子'
	}
})

核心:发布订阅者模式

//		发布订阅者设计模式
//		发布者化整为零,
		class Vue{
			constructor(options){
				this.options = options;
				this.$data = options.data;
				this.$el = document.querySelector(options.el);
				this._directive = {}; 
				
				this.Observer(this.$data);
				this.Complie(this.$el);
			}
			//劫持数据
			Observer(data){
				for( let key in data ){
					this._directive[key] = [];
					console.log(this._directive)
					let Val = data[key];
					let watch = this._directive[key];
					Object.defineProperty(this.$data, key, {
						get : function(){
							return Val;
						},
						set : function(newVal){
							if( newVal !== Val ){//新值不等于老值
								Val = newVal;
								//更新视图
								console.log(watch,'watch')
								watch.forEach(element => {
									element.update();
								})
							}
						}
					})
				}
			}
			//解析指令
			Complie(el){
				let nodes = el.children;
				for(let i = 0;i < nodes.length; i++){
					let node = nodes[i];
					if( nodes[i].children){
						this.Complie(nodes[i]);
					}
					if(node.hasAttribute("v-text")){
//						console.log(1)
						let attrVal = node.getAttribute('v-text');
						this._directive[attrVal].push(new Watcher(node,this,attrVal,'innerHTML'));
//						console.log(this._directive);
					}
					if(node.hasAttribute("v-model")){
						let attrVal = node.getAttribute('v-model');
						this._directive[attrVal].push(new Watcher(node,this,attrVal,'value'));
//						console.log(this._directive);
						node.addEventListener('input',(function(){
							return function(){
								console.log(1);
								this.$data[attrVal] = node.value;
							}
						})().bind(this));
						
					}
				}
			}
		}
//		订阅者
		class Watcher{
//			div.innerHTML = vue对象.$data['myText'];
			constructor(el, vm, exp, attr){
				this.el = el;
				this.vm = vm;
				this.exp = exp;
				this.attr = attr;
				this.update();
			}
			update(){
				this.el[this.attr] = this.vm.$data[this.exp];
			}
		}

浏览器展示效果:

VUE双向绑定原理_vue的数据绑定怎么实现

VUE双向绑定原理_vue的数据绑定怎么实现

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/194001.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pycharm删除的文件 找回_pycharm重命名

    pycharm删除的文件 找回_pycharm重命名1、打开pycharm后,点击项目文件夹右键2、在弹出的菜单中,点击LocalHistory,会自动出现子菜单,点击showhistoy功能;3、弹出本地历史窗口后,左侧显示删除的文件列表及信息(文件名及删除时间;4、选中需要找回的文件后,点击右键,选择Revertselection…

    2022年8月26日
    3
  • 进程间通讯的7种方式是_第一种形态有哪些方式

    进程间通讯的7种方式是_第一种形态有哪些方式**1、常见的通信方式**管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。命名管道FIFO:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。消息队列MessageQueue:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流…

    2022年10月11日
    0
  • 一文读懂堆与栈的区别

    一文读懂堆与栈的区别堆(Heap)与栈(Stack)是开发人员必须面对的两个概念,在理解这两个概念时,需要放到具体的场景下,因为不同场景下,堆与栈代表不同的含义。一般情况下,有两层含义:(1)程序内存布局场景下,堆与栈表示的是两种程序内存分区;(2)数据结构场景下,堆与栈表示两种常用的数据结构。1.程序内存分区——堆与栈栈由操作系统自动分配释放,用于存放函数的参数值、局部变量的值等,其操作方式类…

    2022年5月20日
    31
  • 我个人中意的VS2017/VS2019插件,推荐给大家(#^.^#)

    我个人中意的VS2017/VS2019插件,推荐给大家(#^.^#)1、VS插件,微软官网https://marketplace.visualstudio.com/https://visualstudio.microsoft.com/zh-hans/vs/features/extend/–扩展VisualStudioIDE,入门教程https://marketplace.visualstudio.com/publishers/Microso…

    2022年5月9日
    44
  • myeclipse注册码获取

    myeclipse注册码获取首先在myeclipse随便新建一个javaproject,然后在默认的package中新建一个java文件我名字命名为MyEclipseGen,下面是代码:importjava.io.*;publicclassMyEclipseGen{privatestaticfinalStringLL=”Decompilingthiscopyrighted…

    2022年9月28日
    0
  • linux挂载新磁盘

    linux挂载新磁盘当一个新盘挂载的linux上,可以通过fdisk-l指令,查看挂载的磁盘信息,此时虽然已经挂载到主机上,但是主机还不能正常使用。要想使用新磁盘,需要经过如下几步:磁盘分区磁盘格式化挂载分区到某个目录经过上面三部后,就可以使用上新的磁盘了,接下来讲解每一步具体应该如何操作磁盘分区$fdisk-l#查看主机所有的磁盘列表如上图可以看出/dev/vda是新的磁盘并且没有进行分区操作,接下来对/dev/vda磁盘进行分区操作$fdisk/dev/vda//

    2022年6月19日
    31

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号