柠檬不酸但很苦
新手
新手
  • 最后登录2020-08-06
  • 发帖数1
阅读:5453回复:0

[插件]Vue react 基于的虚拟Dom库 Snabbdom, vnode virtual-dom

楼主#
更多 发布于:2020-08-05 18:56
一、安装snabbdom
npm i snabbdom @0.7.4(因为官网最新版本有些问题,暂时就用上一个版本)

官方文档
二、配置snabbdom
然后在package.json文件的scripts里修改配置

"scripts": {
   "dev": "parcel index.html --open",
   "build": "parcel build index.html"
 }

可以用npm run dev打开
三、配置
简单案例

新建一个html文件

设置html文件标签id为app
//导入snabbdom
import { h, init } from 'snabbdom'
let patch = init([])
//第一个参数:标签+选择器
//第二个参数:如果是字符串的画就是标签中的内容
//let vnode = h('div#container.cls','hello world')
let vnode = h('div#container',[
    h('h1','hello snabbdom'),
    h('p','这是一个p标签')])
//获取html文件中id为app的元素
let app = document.querySelector('#app')
let oldVnode = patch(app,vnode)
/*
vnode = h('div','hello Snabbdom')
//旧的节点对比新节点更新差异
patch(oldVnode,vnode)
*/
setTimeout(()=>{
    vnode = h('div#container',[
        h('h1','hello world'),
        h('p','hello p')
    ])
    patch(oldVnode,vnode)
    //清空页面(因为官网的清空有bug,所以用!直接注释)
    // patch(oldVnode,h('!'))
},2000)
// 照这种方法以此类推,也可以不用写setTimeout直接渲染

案例2(订阅发布)

import {init ,h} from 'snabbdom'
//导入模块(按需导入)
import style from 'snabbdom/modules/style'
import eventlisteners from 'snabbdom/modules/eventlisteners'
//注册模块
let patch = init([
    style,
    eventlisteners
])
//使用h()函数的第二个参数传入模块需要的数据
let vnode = h('div',{
    style:{
        backgroundColor:'red'
    },
    on:{
        click:eventHandler
    }
},[
    h('h1','hello snabbdom'),
    h('p','这是p标签')
])
function eventHandler () {
    console.log('点击')
}
let app = document.querySelector('#app')
patch(app,vnode)


在html文件使用案例

<script>
       //事件出发器
       class EventEmitter {
           constructor () {
               this.subs = Object.create(null)//为null节约性能
           }
           //注册事件
           $on (eventType,handler) {
               this.subs[eventType] = this.subs[eventType] || []
               this.subs[eventType].push(handler)
           }
           //触发事件
           $emit (eventType) {
               if (this.subs[eventType]){
                   this.subs[eventType].forEach(handler =>{
                       handler()
                   })
               }
           }
       }
       let em = new EventEmitter()
       em.$on('click',() => {
           console.log('click2')
       });
       em.$on('click',() => {
           console.log('click2')
       });
       em.$emit('click')
   </script>
[柠檬不酸但很苦于2020-08-06 10:00编辑了帖子]
游客


返回顶部

公众号

公众号