Subs

深入解析vue.js响应式原理与实现

旧街凉风 提交于 2020-03-14 21:52:10
vue.js响应式原理解析与实现。angularjs是通过脏检查来实现数据监测以及页面更新渲染。之后,再接触了vue.js,当时也一度很好奇vue.js是如何监测数据更新并且重新渲染页面。vue.js响应式原理解析与实现 Object.defineProperty es5新增了Object.defineProperty这个api,它可以允许我们为对象的属性来设定getter和setter,从而我们可以劫持用户对对象属性的取值和赋值。比如以下代码: const obj = { }; let val = 'cjg'; Object.defineProperty(obj, 'name', { get() { console.log('劫持了你的取值操作啦'); return val; }, set(newVal) { console.log('劫持了你的赋值操作啦'); val = newVal; } }); console.log(obj.name); obj.name = 'cwc'; console.log(obj.name); //欢迎加入全栈开发交流圈一起学习交流:864305860 我们通过Object.defineProperty劫持了obj[name]的取值和赋值操作,我们可以在obj[name]被赋值的时候触发更新页面操作。 发布订阅模式 当事件发生的时候

Vue的依赖收集、更新

拈花ヽ惹草 提交于 2020-03-12 12:21:00
我们都知道,只要在 Vue 实例中声明过的数据,那么这个数据就是响应式的。 什么是响应式,也即是说,数据发生改变的时候,视图会重新渲染,匹配更新为最新的值。 那么Vue如何监听数据变化? 数据变化后,如何通知视图更新? 数据变化后,视图怎么知道何时更新 思考以上3个问题 先介绍下Object.defineProperty(),因为这个方法是Vue实现响应式系统的重中之重 Object.defineProperty() MDN上的定义: Object.defineProperty()方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。 语法: Object.defineProperty(obj, prop, desc) 使用: const obj = {name: 'Bob'} Object.defineProperty(obj, 'name', { get(){ console.log('get 被触发') }, set(val){ console.log('set 被触发') } }) obj.name //get 被触发 obj.name = 'Lily' //set 被触发 Object.defineProperty可以为对象属性设置get、set函数, get:属性被访问时触发 set:属性被赋值时触发 其实 Object

最长非公共子序列(既不相同也不重复)Longest Uncommon Subsequence II

纵饮孤独 提交于 2020-03-02 15:27:28
问题: Given a list of strings, you need to find the longest uncommon subsequence among them. The longest uncommon subsequence is defined as the longest subsequence of one of these strings and this subsequence should not be any subsequence of the other strings . A subsequence is a sequence that can be derived from one sequence by deleting some characters without changing the order of the remaining elements. Trivially, any string is a subsequence of itself and an empty string is a subsequence of any string. The input will be a list of strings, and the output needs to be the length of the longest

vue核心原理-监测数据变化

╄→尐↘猪︶ㄣ 提交于 2020-02-26 14:56:16
我们实际开发中发现,在data中定义的所有数据,后续无论是在template中使用,还是在methods中使用,都能随着数据的变化而变化。为了理解这其中的原理,研究源码后整理出这篇文章,欢迎大家及时指正。 第一步:数据注册监听 vue 2.x 版本使用的是 Object.defineProperty 详细API文档见Object.defineProperty 用于绑定Object类型数据,比如定义一个person: let person = { name: ‘usm’, age: 12 } 复制代码现在希望person的name和age发生改变时,可以触发一些操作,就可以通过 Object.defineProperty 实现: Object.defineProperty(person, ‘name’, { enumerable: true, configurable: true, get() { console.log(‘get name’s value’); }, set(val) { console.log( set value ${val} ); } }); person.name // get name’s value person.name = ‘new’ // set value new 复制代码其中enumerable属性表示此属性设置为可枚举

Vue数据绑定原理及简单实现

女生的网名这么多〃 提交于 2020-02-14 07:10:56
本篇文章中的代码只是部分片段,完整代码存放于github上 https://github.com/Q-Zhan/simple-vue 。 进入正文~实现数据绑定主要是要实现两个方面的功能:数据变化导致视图变化,视图变化导致数据变化。后者比较容易实现,就是监听视图的事件,然后在回调函数中改变数据。所以重点是数据变化时如何改变视图。 这里的思路是通过object.defineProperty()来对数据的属性设置一个set函数,设置后当数据改变时set函数就会被调用,我们就可以里面进行视图更新操作。 具体实现过程 如上图所示,我们需要一个监听器Observer来给所有的属性设置set函数。如果属性发生了变化,就要通知所有的订阅者Watcher。而这些Watcher统一存放在消息订阅器Dep中,这样比较方便统一管理。Watcher接受到来自Dep的通知后就执行相应的操作去更新视图。 Observer 监听器的核心代码如下: function observe(data) { if (!data || typeof data !== 'object') { return; } Object.keys(data).forEach(function(key) { // 遍历属性,递归设置set函数 defineReactive(data, key, data[key]); }); }

vue源码分析(二)

淺唱寂寞╮ 提交于 2020-01-15 04:31:28
观察者模式 观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为型模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。 vue的响应式原理采用的就是观察者设计模式。下面是观察者模式在vue中的运用解析。 图片来源:https://blog.csdn.net/github_36369819/article/details/79201314 Observer:监听者,通过Obeject.defineProperty对数据进行劫持,数据变更时通知Dep。 Dep:订阅器,用一个数组收集watcher依赖,当数据变更时,通知数组中的watcher进行更新。 Watcher:观察者,收到Dep发来的数据变更通知,获取新数据,更新视图。 下面来看vue中的具体实现。 Observer var Observer = function Observer (value) { this.value = value; this.dep = new Dep(); this.vmCount = 0; def(value, '__ob__', this); if (Array.isArray(value)) { if (hasProto) { protoAugment

Vue内部运行机制解析(整理)

你。 提交于 2019-12-25 05:15:04
解析vue原理的好文: https://github.com/answershuto/learnVue https://www.jianshu.com/p/4c47c12d4b3f 1,vue的运行机制 捕获.PNG 在 new Vue() 之后。 Vue 会调用 init 函数进行初始化,其中最重要的是通过 Object.defineProperty 设置 setter 与 getter 函数,用来实现「响应式」以及「依赖收集」 Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象。 Object.defineProperty(obj,prop,descriptor) 参数 obj:需要定义属性的对象。 prop:需定义或修改的属性的名字。 descriptor:将被定义或修改的属性的描述符。 对象里目前存在的属性描述符有两种主要形式:数据描述符和存取描述符。数据描述符是一个拥有可写或不可写值的属性。存取描述符是由一对 getter-setter 函数功能来描述的属性。 数据描述符和存取描述符均具有以下可选键值: configurable 当且仅当该属性的 configurable 为 true 时,该属性描述符才能够被改变,也能够被删除。默认为 false。 enumerable 当且仅当该属性的

[Vue源码]一起来看Vue双向绑定原理-数据劫持和发布订阅

爱⌒轻易说出口 提交于 2019-12-17 22:24:30
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 有一段时间没有更新技术博文了,因为这段时间埋下头来看Vue源码了。本文我们一起通过学习双向绑定原理来分析Vue源码。预计接下来会围绕Vue源码来整理一些文章,如下。 一起来看Vue双向绑定原理-数据劫持和发布订阅 一起来看Vue模板编译原理(一)-Template生成AST 一起来看Vue模板编译原理(二)-AST生成Render字符串 一起来看Vue虚拟DOM解析-Virtual Dom实现和Dom-diff算法 这些文章统一放在我的git仓库: https://github.com/yzsunlei/javascript-series-code-analyzing 。觉得有用记得star收藏。 简单应用 我们先来看一个简单的应用示例: <div id="app"> <input id="input" type="text" v-model="text"> <div id="text">输入的值为:{{text}}</div> </div> <script> var vm = new Vue({ el: '#app', data: { text: 'hello world' } }) </script> 上面的示例具有的功能就是初始时,'hello world'字符串会显示在input输入框中和div文本中

学习pade法逼近小波

浪尽此生 提交于 2019-12-16 05:14:44
摘要 pade逼近法是常用的使用多项式的形式逼近函数的方法,小波变换中需要对小波函数进行逼近,得到可以用电路实现的传递函数,因此需要用到pade逼近。 正文 1. pade逼近法 1.1 使用pade逼近的全过程 第一点 首先,我们有一个时域上的函数法f(t),把他进行拉普拉斯变换(变到频域,传递函数是频域上的嘛,所以先变了再说),然后对他进行泰勒级数展开,此时我们得到一个多项式 第二点 然后对系数c进行一顿操作,得到函数的传递函数p,q的系数,如下图,就是pade逼近了 第三点 如何进行操作呢, 求解下面两式(已知c求解跑p,q): 2. pade逼近代码 function [f1,f2] = Pade(y,n,x0) syms t; A = zeros(n,n); q = zeros(n,1); p = zeros(n+1,1); b = zeros(n,1); yy = 0; a(1:2*n) = 0.0; for(i=1:2*n) yy = diff(sym(y),findsym(sym(y)),n); a(i) = subs(sym(yy), findsym(sym(yy)), 0.0)/factorial(i); end; for(i=1:n) for(j=1:n) A(i,j)=a(i+j-1); end; b(i,1) = -a(n+i); end; q = A\b

关于ARM的PC指针(什么时候PC+8,PC+4,PC-4,PC-8)转

蓝咒 提交于 2019-12-06 04:28:37
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/lee244868149/article/details/49488575 要理解PC指针,首先就要好好了解LR指针 连接寄存器LR(r14):用来保存和恢复PC寄存器的内容,它有两个特殊功能。 (1)保存子程序返回地址。使用BL或BLX时,跳转指令自动把返回地址放入r14中;子程序通过把r14复制到PC来实现返回,通常用下列指令之一: MOV PC, LR BX LR 通常子程序这样写,保证了子程序中还可以调用子程序。 stmfd sp!, {lr} …… ldmfd sp!, {pc} (2)当异常发生时,异常模式的r14用来保存异常返回地址,将r14如栈可以处理嵌套中断。 程序计数器r15(PC):PC是有读写限制的。当没有超过读取限制的时候,读取的值是指令的地址加上8个字节,由于ARM指令总是以字对齐的,故bit[1:0]总是00。当用str或stm存储PC的时候,偏移量有可能是8或12等其它值。在V3及以下版本中,写入bit[1:0]的值将被忽略,而在V4及以上版本写入r15的bit[1:0]必须为00,否则后果不可预测。 知道PC寄存器和LR寄存器功能以后,再了解一下ARM处理器的三级流水线和多级流水线 首先