demo2
0.Vue的dom更新机制
Vue实现响应式并不是数据发生变化之后DOM立即变化,而是按一定的策略进行DOM的更新
简单来说,Vue是异步执行DOM更新的,异步的运行机制如下:
1.所有的同步任务都在主线程上执行,形成一个执行栈,此时还未涉及DOM
2.主线程之外,还存在一个任务队列,只要异步任务有了结果,就在任务队列之中放置一个事件(Vue开启一个异步队列,并缓冲在此事件循环中发生的所有数据改变。如果同一个watcher被多次触发,只会被推入到队列中一次)
3.一旦执行栈中的所有同步任务执行完毕,系统就会读取任务队列,异步任务就结束等待状态,进入执行栈,开始执行(同步任务执行完毕,开始执行异步watcher队列的任务,更新DOM。Vue在内部尝试对异步队列使用原生的Promise.then和MessageChannel方法,如果执行环境不支持,会采用settimeout(fn, 0)代替)
4.主线程不断重复上面的第三步
1.vm.$nextTick([callback)]
将回调延迟到下次DOM更新循环之后执行。在修改数据之后立即使用它,然后等待DOM更新。它跟全局方法Vue.nextTick一样,不同的是回调的this自动绑定到调用它的实例上。(2.1.0新增:如果没有提供回调且在支持Promise的环境中,则返回一个Promise)
nextTick的触发时机:在同一事件循环中的数据变化后,DOM完成更新,立即执行nextTick(callback)内的回调(可以理解为强制更新render树)
简单总结事件循环:
str.replace(regexp|substr, newSubStr|function)
regexp(pattern):一个RegExp对象或者其字面量。该正则所匹配的内容会被第二个参数的返回值替换掉
substr(pattern):一个将被newSubStr替换的字符串。其被视为一整个字符串,而不是一个正则表达式。仅第一个匹配项会被替换
newSubStr(replacement):用于替换掉第一个参数在原字符串中的匹配部分的字符串。该字符串中可以内插一些特殊的变量名。参考下面的使用字符串作为参数
function(replacement):一个用来创建新子字符串的函数,该函数的返回值将替换掉第一个参数匹配到的结果。参考下面的指定一个函数作为参数