vue数据双向绑定的原理
vue数据双向绑定的原理
一 复习闭包
1 闭包含义:
当函数嵌套时,内部函数使用了外部函数的变量,就会产生闭包
当函数可以记住并访问自己的作用域时,就会产生闭包
2 闭包注意点
① 队列里的代码执行完毕,同步的已经执行完了
② 作用域时js代码解析时创建,关浏览器时销毁
③ 作用域是来维护变量的查找规则的
④ 一个函数作用域一般对应一个执行上下文,除非函数被递归调用
⑤ 执行上下文是函数调用时创建,调用完销毁
⑥ 执行上下文是来存函数执行时需要的数据的
3 鸡肋闭包
// 5.在全局作用域对应的处于活动状态下的执行上下文中寻找 如果找到就使用 如果找不到 报错!function wrap(){// 3.在wrap作用域对应的处于活动状态下的执行上下文中寻找 如果找到就使用// 4.如果找不到查看闭包 如果闭包中也没有如果找不到上上一层作用域var test = "wrap_test";function inner(){//1. 首先在inner作用域对应的处于活动状态下的执行上下文中寻找 如果找到就使用//2. 如果找不到查看闭包 如果闭包中也没有上上一层作用域console.log(test)}inner()}wrap()
作用域:全局作用域,wrap函数作用域 , inner作用域
执行上下文:全局执行上下文 wrap执行上下文 inner执行上下文
4 经典闭包
function wrap(){var test = "wrap_test";return function(){console.log(test)}}var inner = wrap();inner()
5 异步代码闭包
当函数可以记住并访问自己的作用域链时,就会产生闭包
function wrap(){var test = "wrap_test";setTimeout(function (){console.log(test)},0)}wrap()
6 异步面试题
闭包和内部函数是一一对应的 先同步执行,异步执行进了队列等待同步的执行完毕
// 第一次定时器执行时 定时器的回调拿到了一个闭包 闭包的值为{i:0}// 第二次定时器执行时 定时器的回调拿到了一个闭包 闭包的值为{i:1}// 第三次定时器执行时 定时器的回调拿到了一个闭包 闭包的值为{i:2}// 第四次定时器执行时 定时器的回调拿到了一个闭包 闭包的值为{i:3}// 第五次定时器执行时 定时器的回调拿到了一个闭包 闭包的值为{i:4}for(var i=0;i<5;i++){(function(i){// i: 当前function自己的isetTimeout(function(){console.log(i);},1000)})(i)// i :全局的i}//一秒钟之后同时输出01234
for(var i=0;i<5;i++){(function(i){setTimeout(function(){console.log(i);},1000*i)})(i)}
/*如果同步代码执行的时间比较短,那么应该是每隔一秒钟 输入 0 1 2 3 4*/
如果同步代码执行的时间比较长,那么就会一起在在队列中等待,同步代码执行完毕,会同时输出
二 文档碎片
1 querySelector
querySelector拿到的是静态列表,而getElement拿到的则是动态列表
window.onload=function (){//querySelector系列拿到是静态列表!!!!var liNodes = document.querySelectorAll("ul li");var listNode = document.querySelector("#list");//getxxx系列拿到的是动态列表// var liNodes = listNode.getElementsByTagName("li");//dom操作listNode.innerHTML+="<li>5</li>"liNodes = document.querySelectorAll("ul li");//点灯for(var i=0;i<liNodes.length;i++){liNodes[i].style.background="pink";}}
2 template
template.html
<body><template><img :src="url" ></template>
</body>
<script src="./js/text.js"></script>
text.js
var temp = document.querySelector("template");//temp.content:文档碎片对象var fragment = temp.content;console.dir(fragment);//startvar imgNode = fragment.querySelector("img");imgNode.src = "./img/vuex.png"//在start和end之间进行大量的dom操作 且不会触发dom树更新 不会引起浏览器的重新渲染//end//给body元素加一个子节点//将文档碎片作为append的参数时 加入到dom树中的不是该文档碎片 而是文档碎片所有子节点document.body.append(fragment)temp.remove()
}
案例
window.onload=function () {var ulNode = document.querySelector("ul");//创建一个文档碎片var fragment = document.createDocumentFragment();var child = null;//firstChild 会考虑文本节点的while (ulNode.firstChild){// appendChild的参数如果是存在于dom树内部的节点 那appendChild是剪切操作// appendChild的参数如果是一个新创建的节点 那appendChild是添加操作fragment.appendChild(ulNode.firstChild)}//dom树中将不会再有节点 而文档碎片中会塞入所有的ul的子节点//进行大量的dom操作 且界面不会更新 提供了dom操作的性能Array.from(fragment.children).forEach((item)=>{item.innerHTML = "尚硅谷-" + item.innerHTML;})//appendChild 让 fragment作为参数 最终追加到文档中的是fragment的子节点列表 而不是fragment本身ulNode.appendChild(fragment)
三 数据双向绑定
1 js属性
var obj = {a:"a"}obj.b="b"obj.c="c"Object.defineProperty(obj,"c",{// value:"c", //c的属性值// writable:true, //当前属性是否可以被修改enumerable:true,//当前属性是否可枚举(当前属性是否可以出现在对象的for in循环中)configurable:true,//当前属性是否可以重新配置(是否可以被delete关键字删除 是否可以通过defineProperty重新定义)//get set 和 writable value 只能出现一组get(){return "ccc"},set(newval){}})console.log(obj);
2 断点
resume播放按钮:跳到下一个断点处 给回调函数使用(异步代码)
step over:直接跳到下一行代码 如果当前行是个函数,则函数会被立马执行完
step into :跳到函数内部执行代码
step out:跳出该函数
3 mvvm原理
mvvm是 Model-View-ViewModel 的缩写,即 模型-视图-视图模型。
① Model:数据模型,后端传递的数据。(data,props,computed等部分)
② View:代表 UI 组件,它负责将数据模型转化成 UI 展现出来。(template部分)
③ ViewModel:是一个同步View 和 Model的对象。MVVM模式的核心,它连接Model和View的桥梁。
vue的核心,双向绑定、监听(watch)、操作(methods)等部分
数据代理:将data对象中直接属性一个个拿出来给vm实例对象新增同名的属性,此处的代理是浅代理
数据劫持:将data对象中所有属性一个个拿出来重新定义,让他们具备get set方法,此处劫持是深度的
模板解析
dep watcher
① dep(data中的每一个数据):
data中的每一个属性都分配了一个dep,在对data中的数据进行读取或修改时这个dep闭包都会被加载
② watcher(模板上的每一个指令):
在每一个指令被解析的最后一步,都会去构建一个watcher对象,这个对象拥有更新器闭包
模板写法:
<div id = "app"><div v-html="obj.wife.name"></div><span>{{obj.wife.name}}</span>
</div>
一个watcher可能要对用多个dep
一个dep可能对应多个watcher
为了响应式更新,vue需要建立dep和watcher之间的多对多关系
vue数据双向绑定的原理相关推荐
- 西安电话面试:谈谈Vue数据双向绑定原理,看看你的回答能打几分
最近我参加了一次来自西安的电话面试(第二轮,技术面),是大厂还是小作坊我在这里按下不表,先来说说这次电面给我留下印象较深的几道面试题,这次先来谈谈Vue的数据双向绑定原理. 情景再现: 当我手机铃声响 ...
- Vue数据双向绑定原理(vue2向vue3的过渡)
众所周知,Vue的两大重要概念: 数据驱动 组件系统 接下来我们浅析数据双向绑定的原理 一.vue2 1.认识defineProperty vue2中的双向绑定是基于defineProperty的ge ...
- this指向-作用域、作用域链-预解析 变量提升-Vue组件传值 父子 子父 非父子-Vue数据双向绑定原理
目录 this指向 作用域.作用域链 预解析 变量提升 Vue组件传值 父子 子父 非父子 Vue数据双向绑定原理 1.this指向 函数的this指向 看调用.不看声明 (1)普通函数调用 ①函数名 ...
- 小猿圈解析vue数据双向绑定的缺点
vue是当今前端很流行的一种框架,但是vue也是有一定的缺陷的,你有过了解吗?下面小猿圈web前端老师就为你解析一下vue数据双向绑定的缺陷,希望对你有所帮助,下面我们一起了解一下吧. 1.vue 实 ...
- Vue 数据双向绑定
1. 前言 本小节我们将介绍 Vue 中数据的双向绑定指令 v-model.v-model 的学习相对简单 我们可以用 v-model 指令在表单 . 及 元素上创建双向数据绑定.它会根据控件类型自动 ...
- vue数据双向绑定原理
vue 双向绑定原理 官网–https://cn.vuejs.org/v2/guide/reactivity.html 1.vue双向数据绑定是 通过 数据劫持 并结合 发布-订阅模式 的方法来实现的 ...
- vue2数据双向绑定的原理
vue2的数据双向绑定原理使用的是es5的数据劫持object.defineProperty,如果读取数据就会触发get,修改数据就会触发set,达到数据和视图的响应和更新,但是因为js固有的特性,不 ...
- Vue数据双向绑定.sync 和v-model
结论: .sync 和v-model两者的本质都是语法糖, 目的都是实现组件与外部数据的双向绑定. v-model 是 .sync的一种体现..sync 比较灵活;v-model较单一 .sync修饰 ...
- 利用Object.defineProperty实现Vue数据双向绑定
body部分很简单,一个输入框和一个展示的div <div><p>你好,<input id='nickName'></p><div id=&quo ...
最新文章
- Jupyter Notebook 添加目录
- MongoDB实战(4)MapReduce
- 三层着装概念 ,是户外着装的基本要求
- 2.区间成员函数优先于与之对应的单元素成员函数
- python画星空的程序_用python画星空源代码是什么?
- 将ubuntu配置为路由器_“名酒为王”时代来临但资源将尽,看泸州老窖如何进行“名酒资源再配置”丨深度观察...
- 18.外部相机校准——介绍,几何相机校正,自由度 测验,刚体变换,符号_1
- 正式发布 .Net2.0 大文件上传服务器控件
- android下图片压缩
- python可以和java共存吗_python3 and python2 共存
- 如何将Tomcat注册为系统服务
- POJ 3279 Fliptile
- python如何保存计算数据_python – 在scikit-learn中保存新数据的特征向量
- docker常用操作(六)docker安装内网穿透nps
- [产品经理]产品管理的工作流程
- Visual Studio 2013各个版本下载地址
- vue获取屏幕高度、元素高度、元素滚动scrollTop
- android twitter第三方登录,android中接入twitter进行第三方登录
- 高德地图巡航异步加载数据_python3爬虫-高德地图POI数据的爬取
- dhcp服务器是如何进行租约信息的更新的,DHCP服务器
热门文章
- 猫眼java开发工资_Java硕士京东工作1年,跳槽后他期望薪资26K,大家感觉他可以吗...
- 程序员接私活平台_程序员去哪儿接私活?我系统总结了15个国内平台,绝对靠谱...
- java中doloop语句_Java中的do-while循环——通过示例学习Java编程(11)
- mysql left join 中文_MySQL之LEFT JOIN问题汇总
- lua面向对象封装及元表(metatable)性能测试
- C++ (tensorRT中学习)
- 潭州课堂25班:Ph201805201 爬虫高级 第三课 sclapy 框架 腾讯 招聘案例 (课堂笔记)...
- Swift编码总结8
- SSM整理笔记1——SSM网站初步功能设计
- GJM: Unity3D基于Socket通讯例子 [转载]