Vue响应式原理详细讲解
面试官:请你简单的说说什么是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响应式原理详细讲解相关推荐
- Vue响应式原理(含详细代码)
Vue响应式原理介绍 监听Vue实例中的data选项,我们以下用一个普通的js对象模拟data,用Object.defineProperty进行定义属性值的getter和setter方法.当data选 ...
- 【2019 前端进阶之路】深入 Vue 响应式原理,活捉一个 MVVM
作者:江三疯,专注前端开发.欢迎关注公众号前端发动机,第一时间获得作者文章推送,还有各类前端优质文章,致力于成为推动前端成长的引擎. 前言 作为 Vue 面试中的必考题之一,Vue 的响应式原理,想必 ...
- vue 数组删除 dome没更新_详解Vue响应式原理
摘要: 搞懂Vue响应式原理! 作者:浪里行舟 原文:深入浅出Vue响应式原理 Fundebug经授权转载,版权归原作者所有. 前言 Vue 最独特的特性之一,是其非侵入性的响应式系统.数据模型仅仅是 ...
- Vue响应式原理的简单模型
1.前言 最近在梳理vue响应式的原理,有一些心得,值得写一篇博客出来看看. 其实之前也尝试过了解vue响应式的原理,毕竟现在面试看你用的是vue的话,基本上都会问你几句vue响应式的原理.以往学习这 ...
- Vue源码--解读vue响应式原理
原文链接:https://geniuspeng.github.io/2018/01/05/vue-reactivity/ Vue的官方说明里有深入响应式原理这一节.在此官方也提到过: 当你把一个普通的 ...
- 一篇文章带你吃透VUE响应式原理
本篇响应式原理介绍比较长,全文大概1w+字.虽然内容繁杂,但阅读过后,绝对会让你对vue的响应式有更加深刻的理解. 分块阅读,效果更佳.(建议读者有一定vue使用经验和基础再食用) 首先上图,下面这张 ...
- 深入理解Vue响应式原理
前言 Vue响应式原理是Vue最独特的特性之一,当数据模型进行修改时,视图就会进行更新,这使得状态管理简单直接,但是其底层的细节还是需要我们深入学习理解,这样遇到一些问题我们才能快速进行定位,并解决: ...
- 详解Vue响应式原理
摘要: 搞懂Vue响应式原理! 作者:浪里行舟 原文:深入浅出Vue响应式原理 Fundebug经授权转载,版权归原作者所有. 前言 Vue 最独特的特性之一,是其非侵入性的响应式系统.数据模型仅仅是 ...
- Vue 响应式原理(双向数据绑定) 怎样实现 响应式原理?
Vue 响应式原理(双向数据绑定) 怎样实现 响应式原理? 我们在Vue里面,定义在Data里的属性,叫做响应式属性. 每一个vue组件被创建的时候,同时还有一个对象被创建出来了,这个对象我们是看不到 ...
最新文章
- Junit指定测试执行顺序
- 搭建selenium + Python环境的总结:
- Redis实现分布式锁1
- GPU 内存的分级综述(gpu memory hierarchy)
- 关于百度地图api测距显示NaN的解决方案
- SpringBoot整合Mybatis,并实现事务控制
- linux内核编译选项ccl,嵌入式Linux学习笔记(一)
- 【综述】Google团队发布,一文概览Transformer模型的17大高效变种
- (转)使用CUnit进行单元测试和覆盖率统计
- Redis集群环境下分布式锁方案-RedLock算法
- vmware workstation 12 打开vm14 不兼容问题解决
- 希尔伯特变换与三瞬属性简介
- 示波器带宽定义与来源
- Linux Ubuntu18系统下最简单开机自启动程序方法 | 九七的Linux
- 漫话:如何给女朋友解释什么是RPC
- ElementUI 文本内容不能自动换行,内容超出显示(遇到中文、空格才会换行)
- 安卓多媒体开发!Android高级工程师面试实战,系列篇
- 云计算应用(上) -- 云计算应用概述
- 支招:苹果电脑Mac版如何快速解压缩软件
- EXCEL下拉列表选项设置
热门文章
- meso-四(4-烷氨基甲酰苯基)卟啉(AFPP);5-(4-氨基苯基)-10,15.20-三苯基卟啉(TPP-NH2);5,10,15,20-四吡啶基苯基卟啉(H2TPyP)齐岳供应
- matlab 如何axis,在matlab中axis是什么意思,matlab中axis的用法
- 开关稳压电源和线性稳压电源
- 三体船的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- 数字信号处理——FFT
- latex从入门到精通
- 数字图像直方图处理涉及的数学知识介绍
- Android UI美化基本
- android button的美化
- Swing关于JButton去除点击后的内边框的问题纪要!