[TOC]
* * * * *
## 1 源代碼文件
### 1-1刷新入口
~~~
src\dom\read\scan.js\avalon.batch()
~~~
### 1-2刷新實現
~~~
src\strategy\batch.js
~~~
## 2 流程分析
2-1 入口分析
~~~
src\dom\read\scan.js
avalon.batch($id, true)
~~~
> scan.js中掃描節點
> 經過解析,生成渲染函數
> 然后調用batch()函數同步刷新vm與視圖
2-2 實現分析
~~~
src\strategy\batch.js
module.exports = avalon.batch = batchUpdate
~~~
> 導出batchUpdate到avalon.batch()
~~~
function batchUpdate(id, immediate) {
var vm = avalon.vmodels[id]
if (!document.nodeName || !vm || !vm.$render || vm.$render === avalon.noop)
return
if (dirtyTrees[id]) {
avalon.Array.ensure(needRenderIds, id)
} else {
dirtyTrees[id] = true
}
if (isBatchingUpdates) {
return
}
var dom = vm.$element
if (dom) {
flushUpdate(function () {
isBatchingUpdates = true
var vtree = vm.$render()
avalon.diff(vtree, dom.vtree || [])
patch([dom], vtree)
dom.vtree = vtree
avalon.log('rerender', new Date - avalon.rerenderStart)
isBatchingUpdates = false
delete dirtyTrees[id]
for (var i in dirtyTrees) {
batchUpdate(i, true)
break
}
}, immediate)
}
}
~~~
> id:vmodel的$id
> immediate:是否立即刷新
* * * * *
>[info] 環境與參數檢查
* * * * *
> document.nodeName,檢查運行環境,
> vm,vm.$render的參數檢查
* * * * *
>[info] 1 檢查dirtyTrees的當前刷新vm
* * * * *
> dirtyTress以id為索引保存當前刷新vm
> needRenderIds中保存需要刷新的vm
* * * * *
>[info] 2 檢查是否在更新
* * * * *
> isBatchingUpdates 當前更新狀態判斷
* * * * *
>[info] 3 對比刷新
* * * * *
>首先獲取vm對應的元素節點vm.$element
>獲取節點成功 **遞歸調用flushUpdate() batchUpdate()**
進行節點刷新操作
>有點繞,待分析
>重點函數avalon.diff() patch()
分析見附:虛擬DOM
## 3 其他代碼
## 4 總結
- 概述
- 框架目錄
- 組件目錄(components\)
- 生成目錄(dist\)
- 測試目錄(karma\)
- 示例目錄(perf\)
- 主體目錄(src)
- 其他文件
- 框架流程
- 前:章節說明
- 主:模板掃描(avalon.scan())
- 主:VM創建(avalon.define())
- 主:同步刷新(avalon.batch())
- 附:節點解析(avalon.lexer())
- 附:虛擬DOM(avalon.vdomAdaptor())
- 附:渲染函數(avalon.render())
- 附:VM生成(avalon.masterFactory())
- 附:節點diff(avalon.diff())
- 主:界面事件(test)
- 框架工具
- 另:全局函數
- 另:全局正則
- 另:事件接口
- 另:組件接口
- 另:DOMApi
- 框架驅動
- D : 指令實現
- D:兼容處理
- 使用范例
- 基礎原理
- js模塊
- js對象
- js函數
- js數組
- js字符串
- dom接口
- 框架心得
- 心:總體思路