面试官:请你简单的说说什么是Vue的响应式。

小明:mvvm就是视图模型模型视图,只有数据改变视图就会同时更新。

面试官:说的很好,回去等通知吧。

小明:....

Vue响应式原理

先看官方的说法

简单理解就是实例data,Vue通过遍历data中所有对象通过Observer劫持监听所以属性,然后数据一旦发生变化,就通知编译解析变化,更新视图。

首先创建一个data,需要将data变成响应式数据,创建Observer 函数传值data,如果data不是一个对象或者是空就不用处理直接return

 <script>function Observer(targer){if(typeof targer !== 'object' || targer ===null){return targer}}const data = {name:'海海',age:18,info:{address:'广州'},fava:[1,2,3,4,5]}Observer(data)</script>

其他的处理

这里只处理数组,其他

判断是否等于数组,如果等于,如果不等于就循环target,声明响应式函数 defineReactive

传值targer,循环的key和targer[key],然后在 defineReactive调用我们的 Object.defineProperty

 function Observer(targer){if(typeof targer !== 'object' || targer ===null){return targer}if(Array.isArray(targer)) {// 数组}else{for(let key in targer){// 响应式数据的函数defineReactive(targer,key,targer[key])}}}

Object.defineProperty

Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。)

传入我们的参数

拿到get set方法

get

初始值 直接return 我们的value

set

第一个参数是最新的值 newValue

判断如果我们传入的value和newValue不相等,那么就把newValue赋值给value

        function defineReactive(targer,key,value){Object.defineProperty(targer,key,{get(){return value},set(newValue){if(newValue !== value) {value =newValue}}})}

那么问题又来了,如果是一个对象需要监听,我们刚刚的操作只监听到了第一层,如果监听的内容是上面的info就相当于监听了整个对象,答案也很简单,我们只需要在调用defineReactive的时候在调用一次Observer在进入一次循环,当不是object就自动结束了

        function defineReactive(targer,key,value){Observer(value)Object.defineProperty(targer,key,{get(){return value},set(newValue){if(newValue !== value) {value =newValue}}})}

视图更新

我们这里在模仿一下视图更新 定义函数 updataView

        function updataView(){console.log('视图更新了')}

调用

显示视图更新。

数组

先定义一个值 oldArrayProperty 然后将Array.prototype赋值给oldArrayProperty,

然后针对原型对象创建 Object.create()

定义一个 arrProto 来接收。

然后声明数组  ['push','pop','unshift','shift','reverse','sort','splice']  进行循环

   const oldArrayProperty =Array.prototypeconst arrProto = Object.create(oldArrayProperty)const fn = ['push','pop','unshift','shift','reverse','sort','splice']fn.forEach((method)=>{arrProto[method] = function(){} })

然后调用更新视图 updataView  return 将oldArrayProperty对应的方法匹配上return出来

        const oldArrayProperty =Array.prototypeconst arrProto = Object.create(oldArrayProperty)const fn = ['push','pop','unshift','shift','reverse','sort','splice']fn.forEach((method)=>{arrProto[method] = function(){updataView()return oldArrayProperty[method].call(this,...arguments)} })

然后回到Observer方法中,将arrProto赋值给 targer的__proto__原型链上,最后在将targer循环调用Observer,进行数据更新。

  if(Array.isArray(targer)) {// 数组targer.__proto__ =arrProtofor(let i=0;i<targer.length;i++) {Observer(targer[i])}}

测试

到这里我们的监听数据变化并自动更新就完成了。

完整代码

    <script>function defineReactive(targer,key,value){Observer(value)Object.defineProperty(targer,key,{get(){return value},set(newValue){if(newValue !== value) {value =newValueupdataView()}}})}const oldArrayProperty =Array.prototypeconst arrProto = Object.create(oldArrayProperty)const fn = ['push','pop','unshift','shift','reverse','sort','splice']fn.forEach((method)=>{arrProto[method] = function(){updataView()return oldArrayProperty[method].call(this,...arguments)} })function Observer(targer){if(typeof targer !== 'object' || targer ===null){return targer}if(Array.isArray(targer)) {// 数组targer.__proto__ =arrProtofor(let i=0;i<targer.length;i++) {Observer(targer[i])}}else{for(let key in targer){// 响应式数据的函数defineReactive(targer,key,targer[key])}}}function updataView(){console.log('视图更新了')}const data = {name:'海海',age:18,info:{address:'广州'},fava:[1,2,3,4,5]}Observer(data)</script>

如果你还有什么问题你可以选择↓↓↓

微信公众号搜索 海海学前端 了解更多

Vue响应式原理详细讲解相关推荐

  1. Vue响应式原理(含详细代码)

    Vue响应式原理介绍 监听Vue实例中的data选项,我们以下用一个普通的js对象模拟data,用Object.defineProperty进行定义属性值的getter和setter方法.当data选 ...

  2. 【2019 前端进阶之路】深入 Vue 响应式原理,活捉一个 MVVM

    作者:江三疯,专注前端开发.欢迎关注公众号前端发动机,第一时间获得作者文章推送,还有各类前端优质文章,致力于成为推动前端成长的引擎. 前言 作为 Vue 面试中的必考题之一,Vue 的响应式原理,想必 ...

  3. vue 数组删除 dome没更新_详解Vue响应式原理

    摘要: 搞懂Vue响应式原理! 作者:浪里行舟 原文:深入浅出Vue响应式原理 Fundebug经授权转载,版权归原作者所有. 前言 Vue 最独特的特性之一,是其非侵入性的响应式系统.数据模型仅仅是 ...

  4. Vue响应式原理的简单模型

    1.前言 最近在梳理vue响应式的原理,有一些心得,值得写一篇博客出来看看. 其实之前也尝试过了解vue响应式的原理,毕竟现在面试看你用的是vue的话,基本上都会问你几句vue响应式的原理.以往学习这 ...

  5. Vue源码--解读vue响应式原理

    原文链接:https://geniuspeng.github.io/2018/01/05/vue-reactivity/ Vue的官方说明里有深入响应式原理这一节.在此官方也提到过: 当你把一个普通的 ...

  6. 一篇文章带你吃透VUE响应式原理

    本篇响应式原理介绍比较长,全文大概1w+字.虽然内容繁杂,但阅读过后,绝对会让你对vue的响应式有更加深刻的理解. 分块阅读,效果更佳.(建议读者有一定vue使用经验和基础再食用) 首先上图,下面这张 ...

  7. 深入理解Vue响应式原理

    前言 Vue响应式原理是Vue最独特的特性之一,当数据模型进行修改时,视图就会进行更新,这使得状态管理简单直接,但是其底层的细节还是需要我们深入学习理解,这样遇到一些问题我们才能快速进行定位,并解决: ...

  8. 详解Vue响应式原理

    摘要: 搞懂Vue响应式原理! 作者:浪里行舟 原文:深入浅出Vue响应式原理 Fundebug经授权转载,版权归原作者所有. 前言 Vue 最独特的特性之一,是其非侵入性的响应式系统.数据模型仅仅是 ...

  9. Vue 响应式原理(双向数据绑定) 怎样实现 响应式原理?

    Vue 响应式原理(双向数据绑定) 怎样实现 响应式原理? 我们在Vue里面,定义在Data里的属性,叫做响应式属性. 每一个vue组件被创建的时候,同时还有一个对象被创建出来了,这个对象我们是看不到 ...

最新文章

  1. Junit指定测试执行顺序
  2. 搭建selenium + Python环境的总结:
  3. Redis实现分布式锁1
  4. GPU 内存的分级综述(gpu memory hierarchy)
  5. 关于百度地图api测距显示NaN的解决方案
  6. SpringBoot整合Mybatis,并实现事务控制
  7. linux内核编译选项ccl,嵌入式Linux学习笔记(一)
  8. 【综述】Google团队发布,一文概览Transformer模型的17大高效变种
  9. (转)使用CUnit进行单元测试和覆盖率统计
  10. Redis集群环境下分布式锁方案-RedLock算法
  11. vmware workstation 12 打开vm14 不兼容问题解决
  12. 希尔伯特变换与三瞬属性简介
  13. 示波器带宽定义与来源
  14. Linux Ubuntu18系统下最简单开机自启动程序方法 | 九七的Linux
  15. 漫话:如何给女朋友解释什么是RPC
  16. ElementUI 文本内容不能自动换行,内容超出显示(遇到中文、空格才会换行)
  17. 安卓多媒体开发!Android高级工程师面试实战,系列篇
  18. 云计算应用(上) -- 云计算应用概述
  19. 支招:苹果电脑Mac版如何快速解压缩软件
  20. EXCEL下拉列表选项设置

热门文章

  1. meso-四(4-烷氨基甲酰苯基)卟啉(AFPP);5-(4-氨基苯基)-10,15.20-三苯基卟啉(TPP-NH2);5,10,15,20-四吡啶基苯基卟啉(H2TPyP)齐岳供应
  2. matlab 如何axis,在matlab中axis是什么意思,matlab中axis的用法
  3. 开关稳压电源和线性稳压电源
  4. 三体船的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  5. 数字信号处理——FFT
  6. latex从入门到精通
  7. 数字图像直方图处理涉及的数学知识介绍
  8. Android UI美化基本
  9. android button的美化
  10. Swing关于JButton去除点击后的内边框的问题纪要!