深入Vue原理_双向数据绑定(视图/数据)

在这里插入图片描述

欢迎各位小伙伴们!
为大家推荐一款刷题神奇哦 点击链接访问牛客网
各大互联网大厂面试真题。从基础到入阶乃至原理刨析类面试题 应有尽有,赶快来装备自己吧!助你面试稳操胜券,solo全场面试官

文章目录

    • 数据的变化反应到视图
      • 命令式操作视图
      • 声明式操作视图
      • 小结
    • 视图的变化反应到数据
    • 现存的问题
    • 写在最后

数据的变化反应到视图

前面我们了解到数据劫持之后,我们可以在数据发生修改之后做任何我们想要做的事情,操作视图当然也是OK的

命令式操作视图

目标:我们通过原始的操作dom的方式让每一次的name的最新值都能显示到p元素内部

<div id="app"><p></p>
</div>
<script>let data = {name: '小兰同学',age: 18,height:180}// 遍历每一个属性Object.keys(data).forEach((key)=>{// key 属性名// data[key] 属性值defineReactive(data,key,data[key])})function defineReactive(data,key,value){Object.defineProperty(data,key,{get(){return value},set(newVal){value = newVal // 数据发生变化,操作dom进行更新document.querySelector('#app p').innerHTML = data.name}})}// 首次渲染document.querySelector('#app p').innerHTML = data.name
</script>

声明式操作视图

目标:我们将data中name属性的值作为文本渲染到标记了v-text的p标签内部,在vue中,我们把这种标记式的声明式渲染叫做指令

<div id="app"><p v-text="name"></p>
</div>
<script>let data = {name: '小兰同学',age: 18,height: 180}// 遍历每一个属性Object.keys(data).forEach((key) => {// key 属性名// data[key] 属性值// data 原对象defineReactive(data, key, data[key])})function defineReactive(data, key, value) {Object.defineProperty(data, key, {get() {return value},set(newVal) {value = newVal// 数据发生变化,操作dom进行更新compile()}})}// function compile() {let app = document.getElementById('app')// 1.拿到app下所有的子元素const nodes = app.childNodes   //  [text, input, text]//2.遍历所有的子元素nodes.forEach(node => {// nodeType为1为元素节点if (node.nodeType === 1) {const attrs = node.attributes// 遍历所有的attrubites找到 v-modelArray.from(attrs).forEach(attr => {const dirName = attr.nodeNameconst dataProp = attr.nodeValueif (dirName === 'v-text') {node.innerText = data[dataProp]}})}})}// 首次渲染compile()
</script>

小结

  1. 不管是指令也好,插值表达式也好,这些都是将数据反应到视图的标记而已,通过标记我们可以把数据的变化响应式的反应到对应的dom位置上去
  2. 找标记,把数据绑定到dom的过程,我们称之为binding

视图的变化反应到数据

目标:将data中的message属性对应的值渲染到input上面,同时input值发生修改之后,可以反向修改message的值,在vue系统中,v-model指令就是干这个事情的,下面我们就实现一下v-model的功能

<div id="app"><input v-model="name" />
</div>
<script>let data = {name: '小兰同学',age: 18,height: 170}// 遍历每一个属性Object.keys(data).forEach((key) => {// key 属性名// data[key] 属性值// data 原对象defineReactive(data, key, data[key])})function defineReactive(data, key, value) {Object.defineProperty(data, key, {get() {return value},set(newVal) {// 数据发生变化,操作dom进行更新if (newVal === value) {return}value = newValcompile()}})}// 编译函数function compile() {let app = document.getElementById('app')// 1.拿到app下所有的子元素const nodes = app.childNodes   //  [text, input, text]//2.遍历所有的子元素nodes.forEach(node => {// nodeType为1为元素节点if (node.nodeType === 1) {const attrs = node.attributes// 遍历所有的attrubites找到 v-modelArray.from(attrs).forEach(attr => {const dirName = attr.nodeNameconst dataProp = attr.nodeValueif (dirName === 'v-model') {node.value = data[dataProp]// 视图变化反应到数据 无非是事件监听反向修改node.addEventListener('input', (e) => {data[dataProp] = e.target.value})}})}})}// 首次渲染compile()
</script>

现存的问题

无法做到精准更新

<div id="app"><p v-text="name"></p><p v-text="age"></p><p v-text="name"></p>
</div>
<script>let data = {name: '小兰同学',age: 18,height: 180}// 遍历每一个属性Object.keys(data).forEach((key) => {// key 属性名// data[key] 属性值// data 原对象defineReactive(data, key, data[key])})function defineReactive(data, key, value) {Object.defineProperty(data, key, {get() {return value},set(newVal) {// 数据发生变化,操作dom进行更新if (newVal === value) {return}value = newValcompile()}})}// 编译函数function compile() {let app = document.getElementById('app')// 1.拿到app下所有的子元素const nodes = app.childNodes   //  [text, input, text]//2.遍历所有的子元素nodes.forEach(node => {// nodeType为1为元素节点if (node.nodeType === 1) {const attrs = node.attributesArray.from(attrs).forEach(attr => {const dirName = attr.nodeNameconst dataProp = attr.nodeValueconsole.log( dirName,dataProp)if (dirName === 'v-text') {console.log(`更新了${dirName}指令,需要更新的属性为${dataProp}`)node.innerText = data[dataProp]}})}})}// 首次渲染compile()
</script>

下节中对本问题进行修复

写在最后

原创不易,还希望各位大佬支持一下\textcolor{blue}{原创不易,还希望各位大佬支持一下}

👍 点赞,你的认可是我创作的动力!\textcolor{green}{点赞,你的认可是我创作的动力!}

⭐️ 收藏,你的青睐是我努力的方向!\textcolor{green}{收藏,你的青睐是我努力的方向!}

✏️ 评论,你的意见是我进步的财富!\textcolor{green}{评论,你的意见是我进步的财富!}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/248472.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大厂直通车【C认证】踵磅来袭

欢迎各位小伙伴们&#xff01; 首先为大家推荐一款刷题神奇哦 点击链接访问牛客网 各大互联网大厂面试真题。从基础到入阶乃至原理刨析类面试题 应有尽有&#xff0c;赶快来装备自己吧&#xff01;助你面试稳操胜券&#xff0c;solo全场面试官 你还在以为CSDN仅仅是一个简简单单…

深入Vue原理_全面剖析发布订阅模式

文章目录发布订阅模式优化优化思路思考理解发布订阅模式(自定义事件)收集更新函数触发更新函数6.5 总结总结写在最后本期推荐欢迎各位小伙伴们&#xff01; 为大家推荐一款刷题神奇哦 点击链接访问牛客网 各大互联网大厂面试真题。从基础到入阶乃至原理刨析类面试题 应有尽有&a…

web前端发展历程

总览前端发展史前言浏览器的发展史走进前端HTMLCSSjavaScript小前端时代大前端时代写在最后前言 目前在IT公司中前端的岗位越来越成为不可或缺的&#xff0c;前端的地位也愈见明显&#xff0c;很多学校已经体系的传授前端课程&#xff0c;众多培训机构也将前端知识作为了主流课…

修改wordpress上传文件大小限制

1. 登陆wordpress使用的数据库&#xff0c;切换到使用的database 2. 操作如下&#xff1a; > select meta_key from wp_sitemeta; > select meta_key,meta_value from wp_sitemeta where meta_keyfileupload_maxk; 修改为20M: > update wp_sitemeta set meta_value204…

php的符号的排序大小

转载于:https://www.cnblogs.com/cjjjj/p/10433334.html

浅谈 HTTP 和 HTTPS

很多前端伙伴问题有没有体系的面试题&#xff1f; 今天为大家推荐一款刷题神奇哦 点击链接访问牛客网 各大互联网大厂面试真题。从基础到入阶乃至原理刨析类面试题 应有尽有&#xff0c;赶快来装备自己吧&#xff01;助你面试稳操胜券&#xff0c;solo全场面试官 浅谈 HTTP 和 …

Ubuntu 搭建 GitLab 笔记 ***

简介 GitLab 社区版可以提供许多与 GitHub 相同的功能&#xff0c;且部署在属于自己的机器上&#xff0c;我们会因为网络及其他一些问题而不便使用 GitHub &#xff0c;这时部署一个 GitLab 是最好的选择。 下载 GitLab 并安装 我的环境是 Ubuntu 16.04 下进行部署操作。 GitLa…

在浏览器输入URL到页面展示发生了什么?

输入URL后查询缓存DNS服务器TCP三次握手HTTP协议包浏览器处理HTML文档TCP 和 UDP 的区别写在最后很多前端伙伴问题有没有体系的面试题&#xff1f; 今天为大家推荐一款刷题神奇哦 点击链接访问牛客网 各大互联网大厂面试真题。从基础到入阶乃至原理刨析类面试题 应有尽有&#…

iOS 高级去水印,涂鸦去水印

目前在研究一下图像的处理&#xff0c;看了一下相关的软件&#xff0c;比如&#xff1a;《去水印大师》&#xff0c;究竟去水印是怎么处理的呢&#xff1f;看图分析。 一共是三个功能&#xff1a;快速去水印、高级去水印、涂鸦去水印 快速去水印&#xff1a;暂时没找到好的处理…

Failed to execute goal maven-gpg-plugin 1.5 Sign

问题描述&#xff1a; 解决办法&#xff1a;跳过maven-gpg-plugin <build> <pluginManagement><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-gpg-plugin</artifactId><configuration&g…

一文搞懂this指向

前言 那你说一下 js 中的 this 指向吧&#xff01;这句话已经成为面试官口中的高频面试题&#xff0c;作为前端开发的我们&#xff0c;你真的搞懂了 this 指向了吗&#xff1f;快来跟我一起来查漏补缺吧&#xff01;通过几个小案例让大家更能直白的理解 this 指向。 很多前端伙…

难怪大家丢掉了postman而选择 Apifox

前言 当下采用前后端分离模式开发Web应用已经成为气候&#xff0c;在开发阶段有一个不成文的规定则是 项目开发后端先行 但是作为前端开发工程师的我们&#xff0c;难道在搭建完页面后只能等待后端的接口么&#xff1f;这样的话我们则完全被后端开发限制住了。在前面跟大家介绍…

mvc 模式和mtc 模式的区别

首先说说Web服务器开发领域里著名的MVC模式&#xff0c;所谓MVC就是把Web应用分为模型(M)&#xff0c;控制器(C)和视图(V)三层&#xff0c;他们之间以一种插件式的、松耦合的方式连接在一起&#xff0c;模型负责业务对象与数据库的映射(ORM)&#xff0c;视图负责与用户的交互(页…

HP LaserJet MFP M227_M231双面打印

双面打印设置 转载于:https://www.cnblogs.com/xiexiaokui/p/9261577.html

万木成林,我种了“Vue技能树”

初衷 作为Vue技能树的构建者&#xff0c;一直拖延到现在才来写这篇文章&#xff0c;主要还是心里没有底&#xff0c;前面殊不知这颗“树”是否促进了大家学习的热情&#xff0c;也不知它给大家带来了多少收获。说到我们的Vue技能树&#xff0c;我作为尤大大的忠实粉丝自就业后…

poj 3525

多边形内最大半径圆。 哇没有枉费了我自闭了这么些天&#xff0c;大概五天前我看到这种题可能毫无思路抓耳挠腮举手投降什么的&#xff0c;现在已经能1A了哇。 还是先玩一会计算几何&#xff0c;刷个几百道 嗯这个半平面交二分就阔以解决。虽然队友说他施展三分套三分***** 想象…

尤雨溪对 2022 Web前端生态趋势是这样看的

文章目录前言开发范式&底层框架方面趋势基于依赖追踪范式基于依赖追踪范式—共同点基于编译的响应式系统统一模型的优势和代价基于编译的运行是优化Vue Vapor Mode&#xff08;input&#xff09;工具链原生语言在前端工具链中的使用工具链的抽象层次基于 Vite 的上层框架上…

bzoj4919 [Lydsy1706月赛]大根堆

Description 给定一棵n个节点的有根树&#xff0c;编号依次为1到n&#xff0c;其中1号点为根节点。每个点有一个权值v_i。你需要将这棵树转化成一个大根堆。确切地说&#xff0c;你需要选择尽可能多的节点&#xff0c;满足大根堆的性质&#xff1a;对于任意两个点i,j&#xff0…

众多mock工具,这一次我选对了

文章目录写在前面Mock介绍Mock能解决什么问题?传统Mock解决方案Postman接口测试工具Mock js第三方库Eolink解决方案全局Mock高级Mock返回结果Mock智能内置Mock智能自定义Mock约束条件MockEolink的Mock解决方案的优势:写在最后写在前面 交战之前&#xff0c;战士必先利其兵器&…

高并发的理解和使用场景-----特意区别和多线程的关系

一&#xff0c;高并发的理解 1.概念&#xff1a;就是短时间内遇到大量操作请求&#xff0c;导致站点服务器/db服务器资源被占满甚至严重时直接导致宕 2.影响&#xff1a;没有做高并发预处理的系统会给用户很差的体验感&#xff1b; 3.系统好坏的衡量&#xff1a;衡量一个系统的…