深入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,一经查实,立即删除!

相关文章

【BZOJ3894】文理分科

已经连续很久没有当场想出来题了。。。。 $yyb$认为这是一道傻逼题&#xff0c;但是我并不这么认为。。。。 题面 https://www.lydsy.com/JudgeOnline/problem.php?id3894 题解 加点&#xff1a;三叉戟结构的小技巧。 假设割$S$表示不学文&#xff0c;割$T$表示不学理。 对于一…

CodeForces 1131G. Most Dangerous Shark

题目简述&#xff1a;从左到右依次有$n \leq 10^7$个Domino骨牌&#xff0c;高度为$h_i$&#xff0c;手动推倒他的花费为$c_i$。每个骨牌之间的距离为$1$。一个骨牌可以被向左或者向右推倒。当第$i$个骨牌被推倒时&#xff0c;他会以相同方向推倒与其距离$<h_i$的所有骨牌。…

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

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

理解JavaScript中的原型继承(2)

两年前在我学习JavaScript的时候我就写过两篇关于原型继承的博客&#xff1a; 理解JavaScript中原型继承 JavaScript中的原型继承 这两篇博客讲的都是原型的使用&#xff0c;其中一篇还有我学习时的错误理解。今天看《Understanding Scopes》这让我从新思考了一下原型继承&…

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

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

前端面试系列-JS 异步编程

并发与并行的区别&#xff1f; 并发是宏观概念&#xff0c;我分别有任务 A 和任务 B&#xff0c;在一段时间内通过任务间的切换完成了这两个任务&#xff0c;这种情况就可以称之为并发。并行是微观概念&#xff0c;假设 CPU 中存在两个核心&#xff0c;那么我就可以同时完成任务…

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…

打造硬核敲门砖——简历

文章目录 前言打造简历篇幅模板个人信息专业技能工作经历项目经历教育经历个人总结简历格式写在最后前言 作为高校的学生,你是否已经开始设想你以后的工作?作为职场的员工,你是否已经准备更换下一份工作了?不论你现在是什么身份、处于什么阶段,这篇文章都能够帮到你,只要…

Robot Framework 内置变量

Robot Framework 内置变量 转自&#xff1a;https://blog.csdn.net/qq_26886929/article/details/53907755 Robot Framework 内部提供了一下直接可用的内置变量 1. 操作系统相关变量 内置的操作系统相关的变量&#xff0c;减少了测试数据对操作系统之间的差异性的关注 RF 中可用…

一文搞懂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