Snabbdom(虚拟dom)

17 篇文章 0 订阅
16 篇文章 1 订阅

创建项目

  • 创建项目目录 snabbdom

    • md snabbdom

  • 初始化package.json

    • npm init 或 yarn init

  • 安装打包工具

    • npm install parcel-bundler --save-dev 或 yarn add parcel-bundler

  • 配置package.json

    • "scripts": {

    •     "dev":"parcel index.html --open",

    •     "build":"parcel build index.html”,

    • }

  • 目录结构

    • index.html

    • package.json

    • src

      • 01-basicusage.js

查看文档

意义:

  • 学习库,先看文档

  • 通过文档了解库;

  • 查看demo,自己尝试;

  • 查看api的使用;

文档

安装snabbdom

  • npm i snabbdom 或 yarn add snabbdom

导入snabbdom

  • import { h, init, thunk } from 'snabbdom';

  • 错误示例

    • import snabbdom from 'snabbdom';

    • 原因查看 Eexport & Import

snabbdom 三个核心方法

  • init()

    • 高阶函数,返回patch()函数;

  • h()

    • 返回虚拟节点VNode

    • 示例一

  • thunk()

    • 一种优化策略,可以在处理不可变数据时使用;

示例二 显示hello world

示例三 显示div中嵌入h1标签、p标签

模块

Snabbdom的核心库并不能处理元素的属性、样式、事件等,可以使用模块

官方提供的6个模块

  • attributes

    • 设置DOM元素的属性,使用setAttribute();

    • 处理布尔类型的属性

  • props

    • 和attributes模块相似,设置DOM元素的属性element[attr] = value;

    • 不处理布尔类型的属性

  • class

    • 切换类样式

    • 注意:给元素设置类样式是通过sel选择器

  • dataset

    • 设置 data-* 的自定义属性

  • eventlisteners

    • 注册和移除事件

  • style

    • 设置行内样式, 支持动画

    • delayed/remove/destroy

模块的使用步骤

  • 导入需要的模块、

  • Init()中注册模块

  • 使用h()函数创建VNode的时候,可以把第二个参数设置为对象,其他参数往后移

源码 https://github.com/SeriousLose/demos/blob/main/C/snabbdom/src/03-modules.js

// 示例一

new Vue({router,store,render:h=>h(App)}).$mount(“#app”);
// 示例二

// 1. hello world

// init函数
// 参数: 数组,模块
// 返回值:patch函数,作用对比两个VNode的差异更新到真实DOM中
let patch = init([]);

// h函数
// 第一个参数 标签+选择器
// 第二个参数 如果是字符串,就是标签中的内容
// 返回值 VNode
let VNode = h('div#container.cls-name','hello SeriousLose');

// 获取app DOM
let app = document.querySelector("#app");

// patch函数
// 第一个参数: 如果是DOM元素,内部会把DOM元素转换成VNode
// 第二个参数: VNode
// 返回值 VNode
let oldVNode = patch(app,VNode);

// 模拟接口获取数据
setTimeout(() => {
  VNode = h('div','hello SeriousLose ,你好 snabbdom');
  oldVNode = patch(oldVNode,VNode);
}, 1000);
// 示例三

import { h, init } from 'snabbdom';

let patch = init([]);
let VNode = h('div#container',[
  h('h1','hello 苦了'),
  h('p','这是个p标签')
])

let app = document.querySelector("#app");

let oldVNode  = patch(app,VNode);

setTimeout(() => {
  // patch(oldVNode,null)
  oldVNode = patch(oldVNode,h('!'))
}, 2000);

// 示例四

import { eventListenersModule, h, init, styleModule } from 'snabbdom';

let patch = init([
  styleModule,
  eventListenersModule,
])

let VNode = h('div', {
  style: {
    backgroundColor: 'red'
  },
  on: { click: eventHandler }
}, [
  h('h1', 'hello 七夕')
])


function eventHandler () {
  console.log('你好,SeriousLose')
}


let app = document.getElementById("app");
let oldVNode = patch(app, VNode);

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值