init函数
init函数返回值为patch函数,init是一个高阶函数
let patch = init([])
import {h, init} from 'snabbdom'
// init函数的返回值,是一个patch函数,作用是对比两个vnode的差异,更新到真实dom
let patch = init([])
// h函数的作用是生成虚拟dom,用法,第一个参数:标签+选择器
// 第二个参数:如果是字符串,就是标签中的内容
let vnode = h("div#container", "hello world" )
let app = document.querySelector("#app")
/*
patch函数的作用,通过对比vnode,是否更新
第一个参数可以是dom元素,内部把dom转化为虚拟vnode
第二个参数,新的vnode
返回值:vnode,更新视图
*/
let oldNnode = patch(app, vnode)
// 新创建的vnode,会替换原来的container节点
vnode = h("div#change", "hello snabbdom")
patch(oldNnode, vnode)
h函数
h函数将dom生成虚拟节点vnode,最开始使用的hyperScript写的方法,所以使用h作为开头。
let vnode = h("div#container",[
h("h1", "this is h1"),
h("h2", "this is h2"),
h("p", "这是通过h函数创建的虚拟节点node")
])
模块化
常用模块:
- attributes - 设置dom元素的属性,使用setAttribute() 
- props - 和attributes模块类似,设置dom元素属性element[attr] = value; 
- class - 切换类样式,通过sel选择器给元素设置类样式 
- dataset - 设置data-*自定义属性 
- eventlisteners - 注册和移除事件 
- style - 使用模块步骤:- 1.导入需要的模块 
 2.init中注册模块
 3.使用h函数创建vnode时,可以把第二个参数设置为模块对象,其他参数后移- import {h, init, styleModule, eventListenersModule} from "snabbdom"
- /* snabbdom核心代码不能处理属性/事件/样式,如果需要处理,可以使用模块
- */
- // 注册模块
- let patch = init([styleModule, eventListenersModule])
- let vnode = h("div.container", {
- style:{
- color:"blue",
- backgroundColor:"#e1e1e1",
- padding: "10px"
- },
- on:{
- click:clickHandler
- }
- },[
- h("h1", "这是使用模块创建的vnode"),
- h("p", "使用了style和eventlistener模块")
- ])
- function clickHandler(){
- console.log("clickHandler");
- }
- let app = document.querySelector("#app");
- patch(app, vnode)
 
 
                         
                                

