From aa88d326fa7c9395c5700e3a0911b890e519aa0c Mon Sep 17 00:00:00 2001 From: zhe he Date: Wed, 13 Jun 2018 17:16:55 +0800 Subject: [PATCH 01/27] =?UTF-8?q?Update=20=E5=93=8D=E5=BA=94=E5=BC=8F?= =?UTF-8?q?=E5=8E=9F=E7=90=86.MarkDown?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\345\272\224\345\274\217\345\216\237\347\220\206.MarkDown" | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git "a/docs/\345\223\215\345\272\224\345\274\217\345\216\237\347\220\206.MarkDown" "b/docs/\345\223\215\345\272\224\345\274\217\345\216\237\347\220\206.MarkDown" index 23f2083..5788b84 100644 --- "a/docs/\345\223\215\345\272\224\345\274\217\345\216\237\347\220\206.MarkDown" +++ "b/docs/\345\223\215\345\272\224\345\274\217\345\216\237\347\220\206.MarkDown" @@ -19,8 +19,10 @@ function defineReactive (obj, key, val, cb) { get: ()=>{ /*....依赖收集等....*/ /*Github:https://github.com/answershuto*/ + return val }, set:newVal=> { + val = newVal; cb();/*订阅者收到消息的回调*/ } }) @@ -54,7 +56,7 @@ let app = new Vue({ 我们可以在Vue的构造函数constructor中为data执行一个代理[proxy](https://github.com/vuejs/vue/blob/dev/src/core/instance/state.js#L33)。这样我们就把data上面的属性代理到了vm实例上。 ```javascript -_proxy(options.data);/*构造函数中*/ +_proxy.call(this, options.data);/*构造函数中*/ /*代理*/ function _proxy (data) { From 05c8181c5368863ce01da2643c8c0a50f814f4b5 Mon Sep 17 00:00:00 2001 From: zhe he Date: Wed, 13 Jun 2018 18:01:44 +0800 Subject: [PATCH 02/27] =?UTF-8?q?Update=20=E4=BE=9D=E8=B5=96=E6=94=B6?= =?UTF-8?q?=E9=9B=86.MarkDown?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\235\350\265\226\346\224\266\351\233\206.MarkDown" | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git "a/docs/\344\276\235\350\265\226\346\224\266\351\233\206.MarkDown" "b/docs/\344\276\235\350\265\226\346\224\266\351\233\206.MarkDown" index 0f90541..4324f9d 100644 --- "a/docs/\344\276\235\350\265\226\346\224\266\351\233\206.MarkDown" +++ "b/docs/\344\276\235\350\265\226\346\224\266\351\233\206.MarkDown" @@ -26,7 +26,7 @@ new Vue({ 定义一个依赖收集类Dep。 ```javascript -class Dep () { +class Dep { constructor () { this.subs = []; } @@ -47,6 +47,13 @@ class Dep () { } } } +function remove (arr, item) { + if (arr.length) { + const index = arr.indexOf(item) + if (index > -1) { + return arr.splice(index, 1) + } +} ``` ## Watcher @@ -54,7 +61,7 @@ class Dep () { 订阅者,当依赖收集的时候会addSub到sub中,在修改data中数据的时候会触发dep对象的notify,通知所有Watcher对象去修改对应视图。 ```javascript -class Watcher () { +class Watcher { constructor (vm, expOrFn, cb, options) { this.cb = cb; this.vm = vm; From 1d69e60b62f0e6946021c1a2d0945d3d3d8a6907 Mon Sep 17 00:00:00 2001 From: Liushuyuan Date: Mon, 11 Mar 2019 18:29:00 +0800 Subject: [PATCH 03/27] =?UTF-8?q?update=20=E3=80=8AVue=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E6=9C=BA=E5=88=B6=E3=80=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ue\344\272\213\344\273\266\346\234\272\345\210\266.MarkDown" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/docs/Vue\344\272\213\344\273\266\346\234\272\345\210\266.MarkDown" "b/docs/Vue\344\272\213\344\273\266\346\234\272\345\210\266.MarkDown" index a1b8989..cc0e57d 100644 --- "a/docs/Vue\344\272\213\344\273\266\346\234\272\345\210\266.MarkDown" +++ "b/docs/Vue\344\272\213\344\273\266\346\234\272\345\210\266.MarkDown" @@ -5,7 +5,7 @@ ## 初始化事件 初始化事件在vm上创建一个_events对象,用来存放事件。_events的内容如下: -```json +```javascript { eventName: [func1, func2, func3] } From 368f6ce1633299216eb6162fdd48b54e09cbead3 Mon Sep 17 00:00:00 2001 From: Liushuyuan Date: Tue, 12 Mar 2019 10:18:07 +0800 Subject: [PATCH 04/27] =?UTF-8?q?update=20=E4=BE=9D=E8=B5=96=E6=94=B6?= =?UTF-8?q?=E9=9B=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\344\276\235\350\265\226\346\224\266\351\233\206.MarkDown" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/docs/\344\276\235\350\265\226\346\224\266\351\233\206.MarkDown" "b/docs/\344\276\235\350\265\226\346\224\266\351\233\206.MarkDown" index 4324f9d..767714a 100644 --- "a/docs/\344\276\235\350\265\226\346\224\266\351\233\206.MarkDown" +++ "b/docs/\344\276\235\350\265\226\346\224\266\351\233\206.MarkDown" @@ -113,4 +113,4 @@ function defineReactive (obj, key, val, cb) { Dep.target = null; ``` -将观察者Watcher实例赋值给全局的Dep.target,然后触发render操作只有被Dep.target标记过的才会进行依赖收集。有Dep.target的对象会将Watcher的实例push到subs中,在对象被修改出发setter操作的时候dep会调用subs中的Watcher实例的update方法进行渲染。 +将观察者Watcher实例赋值给全局的Dep.target,然后触发render操作只有被Dep.target标记过的才会进行依赖收集。有Dep.target的对象会将Watcher的实例push到subs中,在对象被修改触发setter操作的时候dep会调用subs中的Watcher实例的update方法进行渲染。 From e31bfa0b5d06b446d3d8dbe43821ef0c6af68d23 Mon Sep 17 00:00:00 2001 From: Liushuyuan Date: Tue, 12 Mar 2019 11:48:11 +0800 Subject: [PATCH 05/27] =?UTF-8?q?update=20=E4=BB=8E=E6=BA=90=E7=A0=81?= =?UTF-8?q?=E8=A7=92=E5=BA=A6=E5=86=8D=E7=9C=8B=E6=95=B0=E6=8D=AE=E7=BB=91?= =?UTF-8?q?=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...13\346\225\260\346\215\256\347\273\221\345\256\232.MarkDown" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/docs/\344\273\216\346\272\220\347\240\201\350\247\222\345\272\246\345\206\215\347\234\213\346\225\260\346\215\256\347\273\221\345\256\232.MarkDown" "b/docs/\344\273\216\346\272\220\347\240\201\350\247\222\345\272\246\345\206\215\347\234\213\346\225\260\346\215\256\347\273\221\345\256\232.MarkDown" index c06dd82..5ecd2a1 100644 --- "a/docs/\344\273\216\346\272\220\347\240\201\350\247\222\345\272\246\345\206\215\347\234\213\346\225\260\346\215\256\347\273\221\345\256\232.MarkDown" +++ "b/docs/\344\273\216\346\272\220\347\240\201\350\247\222\345\272\246\345\206\215\347\234\213\346\225\260\346\215\256\347\273\221\345\256\232.MarkDown" @@ -207,7 +207,7 @@ export class { Observer为数据加上响应式属性进行双向绑定。如果是对象则进行深度遍历,为每一个子对象都绑定上方法,如果是数组则为每一个成员都绑定上方法。 -如果是修改一个数组的成员,该成员是一个对象,那只需要递归对数组的成员进行双向绑定即可。但这时候出现了一个问题,?如果我们进行pop、push等操作的时候,push进去的对象根本没有进行过双向绑定,更别说pop了,那么我们如何监听数组的这些变化呢? +如果是修改一个数组的成员,该成员是一个对象,那只需要递归对数组的成员进行双向绑定即可。但这时候出现了一个问题:如果我们进行pop、push等操作的时候,push进去的对象根本没有进行过双向绑定,更别说pop了,那么我们如何监听数组的这些变化呢? Vue.js提供的方法是重写push、pop、shift、unshift、splice、sort、reverse这七个[数组方法](http://v1-cn.vuejs.org/guide/list.html#变异方法)。修改数组原型方法的代码可以参考[observer/array.js](https://github.com/vuejs/vue/blob/dev/src/core/observer/array.js)以及[observer/index.js](https://github.com/vuejs/vue/blob/dev/src/core/observer/index.js#L45)。 ```javascript From bef7023f5967678e13f3af27904eceae7eb7b22a Mon Sep 17 00:00:00 2001 From: lasy <1255352506@qq.com> Date: Tue, 12 Mar 2019 14:36:30 +0800 Subject: [PATCH 06/27] =?UTF-8?q?update=20=E3=80=8A=E4=BE=9D=E8=B5=96?= =?UTF-8?q?=E6=94=B6=E9=9B=86=E3=80=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\344\276\235\350\265\226\346\224\266\351\233\206.MarkDown" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/docs/\344\276\235\350\265\226\346\224\266\351\233\206.MarkDown" "b/docs/\344\276\235\350\265\226\346\224\266\351\233\206.MarkDown" index 767714a..66b3fae 100644 --- "a/docs/\344\276\235\350\265\226\346\224\266\351\233\206.MarkDown" +++ "b/docs/\344\276\235\350\265\226\346\224\266\351\233\206.MarkDown" @@ -17,7 +17,7 @@ new Vue({ }); ``` -按照之前[《响应式原理》](https://github.com/answershuto/learnVue/blob/master/docs/%E5%93%8D%E5%BA%94%E5%BC%8F%E5%8E%9F%E7%90%86.MarkDown)中的方法进行绑定则会出现一个问题——text3在实际模板中并没有被用到,然而当text3的数据被修改的时候(this.text3 = 'test')的时候,同样会触发text3的setter导致重新执行渲染,这显然不正确。 +按照之前[《响应式原理》](https://github.com/answershuto/learnVue/blob/master/docs/%E5%93%8D%E5%BA%94%E5%BC%8F%E5%8E%9F%E7%90%86.MarkDown)中的方法进行绑定则会出现一个问题——text3在实际模板中并没有被用到,然而当text3的数据被修改(this.text3 = 'test')的时候,同样会触发text3的setter导致重新执行渲染,这显然不正确。 ## 先说说Dep From abe34c8cbe192ba15e3b32c22c3fc90dc7fa44c9 Mon Sep 17 00:00:00 2001 From: lasy <1255352506@qq.com> Date: Tue, 12 Mar 2019 15:56:00 +0800 Subject: [PATCH 07/27] =?UTF-8?q?update=20=E3=80=8AVNode=E8=8A=82=E7=82=B9?= =?UTF-8?q?=E3=80=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "docs/VNode\350\212\202\347\202\271.MarkDown" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/docs/VNode\350\212\202\347\202\271.MarkDown" "b/docs/VNode\350\212\202\347\202\271.MarkDown" index 062f29a..61c6abf 100644 --- "a/docs/VNode\350\212\202\347\202\271.MarkDown" +++ "b/docs/VNode\350\212\202\347\202\271.MarkDown" @@ -70,7 +70,7 @@ export default class VNode { this.raw = false /*静态节点标志*/ this.isStatic = false - /*是否作为跟节点插入*/ + /*是否作为根节点插入*/ this.isRootInsert = true /*是否为注释节点*/ this.isComment = false @@ -130,7 +130,7 @@ isOnce: 是否有v-once指令 打个比方,比如说我现在有这么一个VNode树 -```json +```JavaScript { tag: 'div' data: { From ab3ee1940edcbd7a1d4316b2605d95c4f4e08142 Mon Sep 17 00:00:00 2001 From: lasy <1255352506@qq.com> Date: Tue, 12 Mar 2019 16:47:08 +0800 Subject: [PATCH 08/27] =?UTF-8?q?update=20=E3=80=8AVirtualDOM=E4=B8=8Ediff?= =?UTF-8?q?(Vue=E5=AE=9E=E7=8E=B0)=E3=80=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...alDOM\344\270\216diff(Vue\345\256\236\347\216\260).MarkDown" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/docs/VirtualDOM\344\270\216diff(Vue\345\256\236\347\216\260).MarkDown" "b/docs/VirtualDOM\344\270\216diff(Vue\345\256\236\347\216\260).MarkDown" index dab5444..2bf4641 100644 --- "a/docs/VirtualDOM\344\270\216diff(Vue\345\256\236\347\216\260).MarkDown" +++ "b/docs/VirtualDOM\344\270\216diff(Vue\345\256\236\347\216\260).MarkDown" @@ -215,7 +215,7 @@ function sameVnode (a, b) { // so they need to be treated as different nodes /* 判断当标签是的时候,type是否相同 - 某些浏览器不支持动态修改类型,所以他们被视为不同类型 + 某些浏览器不支持动态修改类型,所以他们被视为不同节点 */ function sameInputType (a, b) { if (a.tag !== 'input') return true From 421fc1d8dc3ece6f84b44068c3c43ae566dd1be2 Mon Sep 17 00:00:00 2001 From: lasy <1255352506@qq.com> Date: Tue, 12 Mar 2019 17:36:07 +0800 Subject: [PATCH 09/27] =?UTF-8?q?update=20=E3=80=8AVue.js=E5=BC=82?= =?UTF-8?q?=E6=AD=A5=E6=9B=B4=E6=96=B0DOM=E7=AD=96=E7=95=A5=E5=8F=8AnextTi?= =?UTF-8?q?ck=E3=80=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0DOM\347\255\226\347\225\245\345\217\212nextTick.MarkDown" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/docs/Vue.js\345\274\202\346\255\245\346\233\264\346\226\260DOM\347\255\226\347\225\245\345\217\212nextTick.MarkDown" "b/docs/Vue.js\345\274\202\346\255\245\346\233\264\346\226\260DOM\347\255\226\347\225\245\345\217\212nextTick.MarkDown" index 63ef9c0..6bcfec7 100644 --- "a/docs/Vue.js\345\274\202\346\255\245\346\233\264\346\226\260DOM\347\255\226\347\225\245\345\217\212nextTick.MarkDown" +++ "b/docs/Vue.js\345\274\202\346\255\245\346\233\264\346\226\260DOM\347\255\226\347\225\245\345\217\212nextTick.MarkDown" @@ -89,7 +89,7 @@ export function queueWatcher (watcher: Watcher) { vue.js提供了一个[nextTick](https://cn.vuejs.org/v2/api/#Vue-nextTick)函数,其实也就是上面调用的nextTick。 -nextTick的实现比较简单,执行的目的是在microtask或者task中推入一个funtion,在当前栈执行完毕(也行还会有一些排在前面的需要执行的任务)以后执行nextTick传入的funtion,看一下源码: +nextTick的实现比较简单,执行的目的是在microtask或者task中推入一个function,在当前栈执行完毕(也许还会有一些排在前面的需要执行的任务)以后执行nextTick传入的function,看一下源码: ```javascript /** @@ -232,7 +232,7 @@ setTimeout 回调会被分配到一个新的 task 中执行,而 Promise 的 re 参考顾轶灵知乎的回答:https://www.zhihu.com/question/55364497/answer/144215284 ``` -首先是Promise,(Promise.resolve()).then()可以在microtask中加入它的回调, +首先是Promise,Promise.resolve().then()可以在microtask中加入它的回调, MutationObserver新建一个textNode的DOM对象,用MutationObserver绑定该DOM并指定回调函数,在DOM变化的时候则会触发回调,该回调会进入microtask,即textNode.data = String(counter)时便会加入该回调。 From b0b911a5f7cfaccfb431645bf0f5b6b5cec5f382 Mon Sep 17 00:00:00 2001 From: lasy <1255352506@qq.com> Date: Tue, 12 Mar 2019 17:48:49 +0800 Subject: [PATCH 10/27] =?UTF-8?q?update=20=E3=80=8A=E4=BB=8Etemplate?= =?UTF-8?q?=E5=88=B0DOM(Vue.js=E6=BA=90=E7=A0=81=E8=A7=92=E5=BA=A6?= =?UTF-8?q?=E7=9C=8B=E5=86=85=E9=83=A8=E8=BF=90=E8=A1=8C=E6=9C=BA=E5=88=B6?= =?UTF-8?q?)=E3=80=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\350\277\220\350\241\214\346\234\272\345\210\266).MarkDown" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/docs/\344\273\216template\345\210\260DOM(Vue.js\346\272\220\347\240\201\350\247\222\345\272\246\347\234\213\345\206\205\351\203\250\350\277\220\350\241\214\346\234\272\345\210\266).MarkDown" "b/docs/\344\273\216template\345\210\260DOM(Vue.js\346\272\220\347\240\201\350\247\222\345\272\246\347\234\213\345\206\205\351\203\250\350\277\220\350\241\214\346\234\272\345\210\266).MarkDown" index c845f01..7286dfb 100644 --- "a/docs/\344\273\216template\345\210\260DOM(Vue.js\346\272\220\347\240\201\350\247\222\345\272\246\347\234\213\345\206\205\351\203\250\350\277\220\350\241\214\346\234\272\345\210\266).MarkDown" +++ "b/docs/\344\273\216template\345\210\260DOM(Vue.js\346\272\220\347\240\201\350\247\222\345\272\246\347\234\213\345\206\205\351\203\250\350\277\220\350\241\214\346\234\272\345\210\266).MarkDown" @@ -515,7 +515,7 @@ isOnce: 是否有v-once指令 打个比方,比如说我现在有这么一个VNode树 -```json +```JavaScript { tag: 'div' data: { From 77a5c6148c0570daafe298e4b280f594e0b10aee Mon Sep 17 00:00:00 2001 From: Lasy <1255352506@qq.com> Date: Tue, 19 Mar 2019 12:14:52 +0800 Subject: [PATCH 11/27] Update render.js --- vue-src/core/instance/render.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vue-src/core/instance/render.js b/vue-src/core/instance/render.js index 624c9f2..631fb48 100644 --- a/vue-src/core/instance/render.js +++ b/vue-src/core/instance/render.js @@ -42,7 +42,7 @@ export function initRender (vm: Component) { vm._c = (a, b, c, d) => createElement(vm, a, b, c, d, false) // normalization is always applied for the public version, used in // user-written render functions. - /*常规方法呗用于公共版本,被用来作为用户界面的渲染方法*/ + /*常规方法被用于公共版本,被用来作为用户界面的渲染方法*/ vm.$createElement = (a, b, c, d) => createElement(vm, a, b, c, d, true) } From da73a39f2631ad4b7c1cfd16e9ca4a125b354d17 Mon Sep 17 00:00:00 2001 From: styx11 <1654630248@qq.com> Date: Sat, 30 Mar 2019 11:33:58 +0800 Subject: [PATCH 12/27] =?UTF-8?q?Update=20=E4=BB=8E=E6=BA=90=E7=A0=81?= =?UTF-8?q?=E8=A7=92=E5=BA=A6=E5=86=8D=E7=9C=8B=E6=95=B0=E6=8D=AE=E7=BB=91?= =?UTF-8?q?=E5=AE=9A.MarkDown?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...46\225\260\346\215\256\347\273\221\345\256\232.MarkDown" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/docs/\344\273\216\346\272\220\347\240\201\350\247\222\345\272\246\345\206\215\347\234\213\346\225\260\346\215\256\347\273\221\345\256\232.MarkDown" "b/docs/\344\273\216\346\272\220\347\240\201\350\247\222\345\272\246\345\206\215\347\234\213\346\225\260\346\215\256\347\273\221\345\256\232.MarkDown" index 5ecd2a1..e5b566f 100644 --- "a/docs/\344\273\216\346\272\220\347\240\201\350\247\222\345\272\246\345\206\215\347\234\213\346\225\260\346\215\256\347\273\221\345\256\232.MarkDown" +++ "b/docs/\344\273\216\346\272\220\347\240\201\350\247\222\345\272\246\345\206\215\347\234\213\346\225\260\346\215\256\347\273\221\345\256\232.MarkDown" @@ -197,7 +197,7 @@ export class { */ observeArray (items: Array) { - /*数组需要便利每一个成员进行observe*/ + /*数组需要遍历每一个成员进行observe*/ for (let i = 0, l = items.length; i < l; i++) { observe(items[i]) } @@ -280,7 +280,7 @@ export const arrayMethods = Object.create(arrayProto) * Intercept mutating methods and emit events */ /*这里重写了数组的这些方法,在保证不污染原生数组原型的情况下重写数组的这些方法,截获数组的成员发生的变化,执行原生数组操作的同时dep通知关联的所有观察者进行响应式处理*/ -;[ +[ 'push', 'pop', 'shift', @@ -420,7 +420,7 @@ export default class Watcher { /* 执行了getter操作,看似执行了渲染操作,其实是执行了依赖收集。 - 在将Dep.target设置为自生观察者实例以后,执行getter操作。 + 在将Dep.target设置为自身观察者实例以后,执行getter操作。 譬如说现在的的data中可能有a、b、c三个数据,getter渲染需要依赖a跟c, 那么在执行getter的时候就会触发a跟c两个数据的getter函数, 在getter函数中即可判断Dep.target是否存在然后完成依赖收集, From edcf1afe7f634bf00e6c40a1b6c7cd5b58b233ad Mon Sep 17 00:00:00 2001 From: styx11 <1654630248@qq.com> Date: Thu, 11 Apr 2019 14:42:23 +0800 Subject: [PATCH 13/27] =?UTF-8?q?update=20=E4=BB=8Etemplate=E5=88=B0DOM(Vu?= =?UTF-8?q?e.js=E6=BA=90=E7=A0=81=E8=A7=92=E5=BA=A6=E7=9C=8B=E5=86=85?= =?UTF-8?q?=E9=83=A8=E8=BF=90=E8=A1=8C=E6=9C=BA=E5=88=B6).MarkDown?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\220\350\241\214\346\234\272\345\210\266).MarkDown" | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git "a/docs/\344\273\216template\345\210\260DOM(Vue.js\346\272\220\347\240\201\350\247\222\345\272\246\347\234\213\345\206\205\351\203\250\350\277\220\350\241\214\346\234\272\345\210\266).MarkDown" "b/docs/\344\273\216template\345\210\260DOM(Vue.js\346\272\220\347\240\201\350\247\222\345\272\246\347\234\213\345\206\205\351\203\250\350\277\220\350\241\214\346\234\272\345\210\266).MarkDown" index 7286dfb..535f4a4 100644 --- "a/docs/\344\273\216template\345\210\260DOM(Vue.js\346\272\220\347\240\201\350\247\222\345\272\246\347\234\213\345\206\205\351\203\250\350\277\220\350\241\214\346\234\272\345\210\266).MarkDown" +++ "b/docs/\344\273\216template\345\210\260DOM(Vue.js\346\272\220\347\240\201\350\247\222\345\272\246\347\234\213\345\206\205\351\203\250\350\277\220\350\241\214\346\234\272\345\210\266).MarkDown" @@ -9,7 +9,7 @@ let vm = new Vue({ 很多同学好奇,在new一个Vue对象的时候,内部究竟发生了什么? -究竟Vue.js是如何将data中的数据渲染到真实的宿主环境环境中的? +究竟Vue.js是如何将data中的数据渲染到真实的宿主环境中的? 又是如何通过“响应式”修改数据的? @@ -32,7 +32,7 @@ function Vue (options) { } ``` -Vue的构造类只做了一件事情,就是调用_init函数进行 +Vue的构造类只做了一件事情,就是调用_init函数进行初始化 来看一下init的代码 @@ -263,7 +263,7 @@ export const arrayMethods = Object.create(arrayProto) * Intercept mutating methods and emit events */ /*这里重写了数组的这些方法,在保证不污染原生数组原型的情况下重写数组的这些方法,截获数组的成员发生的变化,执行原生数组操作的同时dep通知关联的所有观察者进行响应式处理*/ -;[ +[ 'push', 'pop', 'shift', @@ -312,7 +312,7 @@ export const arrayMethods = Object.create(arrayProto) ``` -从数组的原型新建一个Object.create(arrayProto)对象,通过修改此原型可以保证原生数组方法不被污染。如果当前浏览器支持__proto__这个属性的话就可以直接覆盖该属性则使数组对象具有了重写后的数组方法。如果没有该属性的浏览器,则必须通过遍历def所有需要重写的数组方法,这种方法效率较低,所以优先使用第一种。 +从数组的原型新建一个Object.create(arrayProto)对象,通过修改此原型可以保证原生数组方法不被污染。如果当前浏览器支持__proto__这个属性的话就可以直接覆盖该属性使数组对象具有了重写后的数组方法。如果浏览器没有该属性,则必须通过遍历def所有需要重写的数组方法,这种方法效率较低,所以优先使用第一种。 在保证不污染不覆盖数组原生方法添加监听,主要做了两个操作,第一是通知所有注册的观察者进行响应式处理,第二是如果是添加成员的操作,需要对新成员进行observe。 @@ -323,7 +323,7 @@ export const arrayMethods = Object.create(arrayProto) ## template编译 -在$mount过程中,如果是独立构建构建,则会在此过程中将template编译成render function。当然,你也可以采用运行时构建。具体参考[运行时-编译器-vs-只包含运行时](https://cn.vuejs.org/v2/guide/installation.html#运行时-编译器-vs-只包含运行时)。 +在$mount过程中,如果是使用独立构建,则会在此过程中将template编译成render function。当然,你也可以采用运行时构建。具体参考[运行时-编译器-vs-只包含运行时](https://cn.vuejs.org/v2/guide/installation.html#运行时-编译器-vs-只包含运行时)。 template是如何被编译成render function的呢? From 244b67b627b2e10f939bed9ad034ba55bfcccdaf Mon Sep 17 00:00:00 2001 From: styx11 <1654630248@qq.com> Date: Thu, 11 Apr 2019 14:42:50 +0800 Subject: [PATCH 14/27] =?UTF-8?q?update=20Vuex=E6=BA=90=E7=A0=81=E8=A7=A3?= =?UTF-8?q?=E6=9E=90.MarkDown?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7\240\201\350\247\243\346\236\220.MarkDown" | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git "a/docs/Vuex\346\272\220\347\240\201\350\247\243\346\236\220.MarkDown" "b/docs/Vuex\346\272\220\347\240\201\350\247\243\346\236\220.MarkDown" index 0610cb0..a6eba86 100644 --- "a/docs/Vuex\346\272\220\347\240\201\350\247\243\346\236\220.MarkDown" +++ "b/docs/Vuex\346\272\220\347\240\201\350\247\243\346\236\220.MarkDown" @@ -8,7 +8,7 @@ Vuex是一个专门为Vue.js框架设计的、用于对Vue.js应用程序进行 先来看一下这张Vuex的数据流程图,熟悉Vuex使用的同学应该已经有所了解。 -![](https://vuex.vuejs.org/zh-cn/images/vuex.png) +![](https://vuex.vuejs.org/vuex.png) Vuex实现了一个单向数据流,在全局拥有一个State存放数据,所有修改State的操作必须通过Mutation进行,Mutation的同时提供了订阅者模式供外部插件调用获取State数据的更新。所有异步接口需要走Action,常见于调用后端接口异步获取更新数据,而Action也是无法直接修改State的,还是需要通过Mutation来修改State的数据。最后,根据State的变化,渲染到视图上。Vuex运行依赖Vue内部数据双向绑定机制,需要new一个Vue对象来实现“响应式化”,所以Vuex是一个专门为Vue.js设计的状态管理库。 @@ -51,7 +51,7 @@ export function install (_Vue) { } ``` -这段install代码做了两件事情,一件是防止Vuex被重复安装,另一件是执行applyMixin,目的是执行vuexInit方法初始化Vuex。Vuex针对Vue1.0与2.0分别进行了不同的处理,如果是Vue1.0,Vuex会将vuexInit方法放入Vue的_init方法中,而对于Vue2.0,则会将vuexinit混淆进Vue的beforeCreacte钩子中。来看一下vuexInit的代码。 +这段install代码做了两件事情,一件是防止Vuex被重复安装,另一件是执行applyMixin,目的是执行vuexInit方法初始化Vuex。Vuex针对Vue1.0与2.0分别进行了不同的处理,如果是Vue1.0,Vuex会将vuexInit方法放入Vue的_init方法中,而对于Vue2.0,则会将vuexinit混淆进Vue的beforeCreate钩子中。来看一下vuexInit的代码。 ```javascript /*Vuex的init钩子,会存入每一个Vue实例等钩子列表*/ @@ -76,7 +76,7 @@ vuexInit会尝试从options中获取store,如果当前组件是根组件(Roo ## Store -我们传入到根组件到store,就是Store实例,用Vuex提供到Store方法构造。 +我们传入到根组件的store,就是Store实例,用Vuex提供的Store方法构造。 ```javascript export default new Vuex.Store({ @@ -161,7 +161,7 @@ constructor (options = {}) { // init root module. // this also recursively registers all sub-modules // and collects all module getters inside this._wrappedGetters - /*初始化根module,这也同时递归注册了所有子modle,收集所有module的getter到_wrappedGetters中去,this._modules.root代表根module才独有保存的Module对象*/ + /*初始化根module,这也同时递归注册了所有子module,收集所有module的getter到_wrappedGetters中去,this._modules.root代表根module才独有保存的Module对象*/ installModule(this, state, [], this._modules.root) // initialize the store vm, which is responsible for the reactivity @@ -184,7 +184,7 @@ Store的构造类除了初始化一些内部变量以外,主要执行了instal ### installModule -installModule的作用主要是用为module加上namespace名字空间(如果有)后,注册mutation、action以及getter,同时递归安装所有子module。 +installModule的作用主要是为module加上namespace名字空间(如果有)后,注册mutation、action以及getter,同时递归安装所有子module。 ```javascript /*初始化module*/ @@ -207,7 +207,7 @@ function installModule (store, rootState, path, module, hot) { /* module的name */ const moduleName = path[path.length - 1] store.`_withCommit`(() => { - /* 将子module设置称响应式的 */ + /* 将子module设成响应式的 */ Vue.set(parentState, moduleName, module.state) }) } @@ -367,7 +367,7 @@ Vuex的Store构造类的option有一个strict的参数,可以控制Vuex执行 function enableStrictMode (store) { store._vm.$watch(function () { return this._data.$$state }, () => { if (process.env.NODE_ENV !== 'production') { - /* 检测store中的_committing的值,如果是true代表不是通过mutation的方法修改的 */ + /* 检测store中的_committing的值,如果是false代表不是通过mutation的方法修改的 */ assert(store._committing, `Do not mutate vuex store state outside mutation handlers.`) } }, { deep: true, sync: true }) @@ -398,7 +398,7 @@ _withCommit (fn) { } ``` -我们发现,通过commit(mutation)修改state数据的时候,会再调用mutation方法之前将committing置为true,接下来再通过mutation函数修改state中的数据,这时候触发$watch中的回调断言committing是不会抛出异常的(此时committing为true)。而当我们直接修改state的数据时,触发$watch的回调执行断言,这时committing为false,则会抛出异常。这就是Vuex的严格模式的实现。 +我们发现,通过commit(mutation)修改state数据的时候,会在调用mutation方法之前将committing置为true,接下来再通过mutation函数修改state中的数据,这时候触发$watch中的回调断言committing是不会抛出异常的(此时committing为true)。而当我们直接修改state的数据时,触发$watch的回调执行断言,这时committing为false,则会抛出异常。这就是Vuex的严格模式的实现。 接下来我们来看看Store提供的一些API。 @@ -480,7 +480,7 @@ dispatch (_type, _payload) { payload } = unifyObjectStyle(_type, _payload) - /* actions中取出type对应的ation */ + /* actions中取出type对应的action */ const entry = this._actions[type] if (!entry) { if (process.env.NODE_ENV !== 'production') { From 76ffa6c6144adfbcc7b10745757f633986553ef2 Mon Sep 17 00:00:00 2001 From: "ranmo.cy" Date: Sun, 28 Apr 2019 19:55:33 +0800 Subject: [PATCH 15/27] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E5=85=AC?= =?UTF-8?q?=E4=BC=97=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index d7862f2..b12738f 100644 --- a/README.md +++ b/README.md @@ -55,11 +55,11 @@ Vue.js源码分析,记录了个人学习Vue.js源码的过程中的一些心 ![](https://i.loli.net/2018/04/01/5ac0836626d86.jpg) -## 赞助我 +## 我的公众号 -如果觉得这些内容不错,请我喝杯咖啡吧。 +长期分享各种前端技术,扫码或搜索“染陌的技术空间” -![](https://i.loli.net/2018/03/26/5ab9081f17fe5.jpg) +![](https://img.alicdn.com/tfs/TB1rWrVTgHqK1RjSZFgXXa7JXXa-258-258.jpg) ## 关于作者 From 23e4f49014336011298ea5e4ee99338a298aa911 Mon Sep 17 00:00:00 2001 From: "ranmo.cy" Date: Fri, 17 May 2019 20:13:12 +0800 Subject: [PATCH 16/27] update README --- README.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index b12738f..4f0e265 100644 --- a/README.md +++ b/README.md @@ -53,13 +53,11 @@ Vue.js源码分析,记录了个人学习Vue.js源码的过程中的一些心 笔者撰写的[《剖析 Vue.js 内部运行机制》](https://juejin.im/book/5a36661851882538e2259c0f)或许可以帮到你。 -![](https://i.loli.net/2018/04/01/5ac0836626d86.jpg) - ## 我的公众号 -长期分享各种前端技术,扫码或搜索“染陌的技术空间” +长期分享各种前端技术,扫码或搜索“前端技术优选” -![](https://img.alicdn.com/tfs/TB1rWrVTgHqK1RjSZFgXXa7JXXa-258-258.jpg) +![](https://img.alicdn.com/tfs/TB1N04OXoKF3KVjSZFEXXXExFXa-344-344.jpg) ## 关于作者 From 159eb085b520ed9ecf3151a6da91564864783687 Mon Sep 17 00:00:00 2001 From: liyang <1909457483@qq.com> Date: Sat, 18 May 2019 16:47:52 +0800 Subject: [PATCH 17/27] =?UTF-8?q?fix:Vuex=E6=BA=90=E7=A0=81=E8=A7=A3?= =?UTF-8?q?=E6=9E=90=E4=B8=AD=E5=B0=86.getter=E6=94=B9=E4=B8=BA.getters?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ex\346\272\220\347\240\201\350\247\243\346\236\220.MarkDown" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/docs/Vuex\346\272\220\347\240\201\350\247\243\346\236\220.MarkDown" "b/docs/Vuex\346\272\220\347\240\201\350\247\243\346\236\220.MarkDown" index a6eba86..773e463 100644 --- "a/docs/Vuex\346\272\220\347\240\201\350\247\243\346\236\220.MarkDown" +++ "b/docs/Vuex\346\272\220\347\240\201\350\247\243\346\236\220.MarkDown" @@ -330,7 +330,7 @@ function resetStoreVM (store, state, hot) { } ``` -resetStoreVM首先会遍历wrappedGetters,使用Object.defineProperty方法为每一个getter绑定上get方法,这样我们就可以在组件里访问this.$store.getter.test就等同于访问store._vm.test。 +resetStoreVM首先会遍历wrappedGetters,使用Object.defineProperty方法为每一个getter绑定上get方法,这样我们就可以在组件里访问this.$store.getters.test就等同于访问store._vm.test。 ```javascript forEachValue(wrappedGetters, (fn, key) => { From a44a50210d8c4e72585b294053917572e722fe39 Mon Sep 17 00:00:00 2001 From: answershuto Date: Wed, 22 May 2019 19:00:47 +0800 Subject: [PATCH 18/27] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=85=AC=E4=BC=97?= =?UTF-8?q?=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4f0e265..fd11c46 100644 --- a/README.md +++ b/README.md @@ -53,11 +53,12 @@ Vue.js源码分析,记录了个人学习Vue.js源码的过程中的一些心 笔者撰写的[《剖析 Vue.js 内部运行机制》](https://juejin.im/book/5a36661851882538e2259c0f)或许可以帮到你。 -## 我的公众号 +## 获取更多前端领域优质技术博文 -长期分享各种前端技术,扫码或搜索“前端技术优选” +扫码或微信搜索“前端技术优选”,长期分享前端及Node.js领域优质技术博文,欢迎关注。 + +![](https://img.alicdn.com/tfs/TB1JpCeXR1D3KVjSZFyXXbuFpXa-344-344.jpg) -![](https://img.alicdn.com/tfs/TB1N04OXoKF3KVjSZFEXXXExFXa-344-344.jpg) ## 关于作者 From b3db3ab837ac05c0fd9f4db55f1c3b24247e5828 Mon Sep 17 00:00:00 2001 From: answershuto <905307789@qq.com> Date: Mon, 22 Jul 2019 23:27:16 +0800 Subject: [PATCH 19/27] =?UTF-8?q?=E5=8A=A0=E5=85=A5=E7=BE=A4=E8=81=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 9 ++++----- images/youxuan.png | Bin 0 -> 460950 bytes 2 files changed, 4 insertions(+), 5 deletions(-) create mode 100644 images/youxuan.png diff --git a/README.md b/README.md index fd11c46..b03a8b8 100644 --- a/README.md +++ b/README.md @@ -59,21 +59,20 @@ Vue.js源码分析,记录了个人学习Vue.js源码的过程中的一些心 ![](https://img.alicdn.com/tfs/TB1JpCeXR1D3KVjSZFyXXbuFpXa-344-344.jpg) +## 与更多技术同行交流 + +![](./images/youxuan.png) ## 关于作者 作者: 染陌 -微信: answershuto - -Email:answershuto@gmail.com or answershuto@126.com +Email:answershuto@gmail.com Github: [https://github.com/answershuto](https://github.com/answershuto) 知乎:[https://www.zhihu.com/people/cao-yang-49/activities](https://www.zhihu.com/people/cao-yang-49/activities) -知乎专栏: [https://zhuanlan.zhihu.com/ranmo](https://zhuanlan.zhihu.com/ranmo) - 掘金:[https://juejin.im/user/58f87ae844d9040069ca7507](https://juejin.im/user/58f87ae844d9040069ca7507) 对内容有任何疑问,欢迎联系我。 \ No newline at end of file diff --git a/images/youxuan.png b/images/youxuan.png new file mode 100644 index 0000000000000000000000000000000000000000..2295f97f45ff87846f1823db90c11afbd3d809e0 GIT binary patch literal 460950 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