1.用js对象来表达dom结构html
tagName 标签名
props 元素属性
key 惟一标识
children 子元素,格式和父元素同样
count 有几个子元素,用于计算当前元素的索引,处于整个dom中的第几个,方便dom操做node
{ "tagName": "div", "props": { "id": "container" }, "children": [ { "tagName": "h1", "props": { "style": "color:red" }, "children": [ "simple virtual dom" ], "count": 1 }, { "tagName": "p", "props": {}, "children": [ "hello world" ], "count": 1 }, { "tagName": "ul", "props": {}, "children": [ { "tagName": "li", "props": {}, "children": [ "item #1" ], "count": 1 }, { "tagName": "li", "props": {}, "children": [ "item #2" ], "count": 1 } ], "count": 4 } ], "count": 9 }
2.原js对象渲染成dom结构json
<div id="container"> <h1 style="color: red;">simple virtual dom</h1> <p>hello world</p> <ul> <li>item #1</li> <li>item #2</li> </ul> </div>
3.修改原js对象框架
{ "tagName": "div", "props": { "id": "container2" }, "children": [ { "tagName": "h5", "props": { "style": "color:red" }, "children": [ "simple virtual dom" ], "count": 1 }, { "tagName": "p", "props": {}, "children": [ "hello world2" ], "count": 1 }, { "tagName": "ul", "props": {}, "children": [ { "tagName": "li", "props": {}, "children": [ "item #1" ], "count": 1 }, { "tagName": "li", "props": {}, "children": [ "item #2" ], "count": 1 }, { "tagName": "li", "props": {}, "children": [ "item #3" ], "count": 1 } ], "count": 6 } ], "count": 11 }
4.对比哪些节点被修改
type 类型,0为标签名改变,1为子元素改变(删除或添加),2为属性改变,3为内容改变
key 对象第一层中key值表示索引,原dom中第几个元素发生变化dom
{ "0": [ { "type": 2, "props": { "id": "container2" } } ], "1": [ { "type": 0, "node": { "tagName": "h5", "props": { "style": "color:red" }, "children": [ "simple virtual dom" ], "count": 1 } } ], "4": [ { "type": 3, "content": "hello world2" } ], "5": [ { "type": 1, "moves": [ { "index": 2, "item": { "tagName": "li", "props": {}, "children": [ "item #3" ], "count": 1 }, "type": 1 } ] } ] }
5.渲染修改后的js对象spa
a.标签名改变,直接从新渲染整个元素,包括元素下的子元素 b.子元素改变,该删除的删除,该添加的添加(针对列表框架有一套本身的计算方法,能够自行百度去研究) c.属性改变,操做对应元素的属性 d.内容改变,操做对应元素的内容
<div id="container2"> <h5 style="color: red;">simple virtual dom</h5> <p>hello world2</p> <ul> <li>item #1</li> <li>item #2</li> <li>item #3</li> </ul> </div>