简单使用hyperHTML — 第二部分

事件和组件
部分 2 作者 Paul Thompson and Ivan Torres(唐华).

Version en español

English version

翻译人: Hades

  • 简介wire/bind
  • 事件和组件
  • 更多状态和简单状态管理
  • 引用类型和自定义类型
  • 自定义元素
  • 自定义我的”自定义元素”
  • 小测试!
  • 异步加载,占位符和代码补全
  • Handling routes
  • 第三方类库
1_9xn2AlWR1kZP9p7X_zqMgA.jpeg

如果你看完第一部分, 现在你就知道了关于hyperHTML的基础了. 这次我们要深入了解一下. 回忆一下我们在第一部分中建立的表:

https://stackblitz.com/edit/basics-table?ctl=1&embed=1&file=index.js

让我们从表头的列的排序开始.

事件

首先,我们把之前的例子中的渲染部分移植到一个函数中,以便复用. 例子如下:

https://gist.github.com/pinguxx/1fa59056bb9a78acfc6ebc7b78eeda43#file-render-simple-table-js

我们将它变成下面的样子:

https://gist.github.com/pinguxx/ca3f9fd8356e2df57abdfc7590f8fd3f#file-render-simple-table-fn-js

接下来我们要做的是更新列头,包含一个 <a> 标签, 为了让用户知道这是一个可点击的地方. 我们还需要一个监听事件去捕获单击事件. 为了简单明了, 我们添加一个 data-target 参数, 为了让开发者知道用户想要对哪一列进行排序. 通过这里的这些步骤我们的 <thead> 模板就告一段落了:

https://gist.github.com/pinguxx/1f9886d5da544065bd67e3d31b4b3fae#file-render-simple-table-fn-2-js

什么是 onclick ? HyperHTML 允许我们传入一个函数并且它会被我们调用. 让我们创建一个简单的排序函数,去看看会发生什么:

https://gist.github.com/pinguxx/24b43256a8e3f9ba799926187ab03868#file-render-simple-table-sort-js

在这个例子中,我们的目标和当前的几点是相同的.很好!现在我们有了一个包含data-target的锚点,就是用来排序的锚点.让我们更新一下我们的排序函数:

https://gist.github.com/pinguxx/71b23929ed5e65bf2e4e547791194b7c#file-render-simple-table-sort-1-js

是不是看起来不错,但是如果用户第二次点击这表头,这个表就不能再次返回原来的顺序了.这是我们需要的功能,所以让我们一起修复这个问题然后看看它是怎么工作的.

https://stackblitz.com/edit/basics-table-1

如果你查看这个表的代码了,你会看到,只有内容行被重新绘制了,即使我们每次都调用显示方法(display).HyperHTML 非常聪明,它只更新了被改变的那部分.所以这就证明了它的执行有多快,渲染函数使用起来有多简单.


组件

现在我们的表也有了, 接下来就更简单了,如果我们把所有相关的代码都放到一个单独的地方.然后清空我们的代码, 我们可以在其他的项目中复用这个表.我们可以用一个简单的对象证明:

https://stackblitz.com/edit/basics-table-2

之前我们有一个带HTML的基础JS对象,作为我们的渲染变量 ,数据作为我们的数组变量和状态. 我们把render()函数从display()函数中移出来, 然后注意:我们就没有排序sort()函数了. 取而代之, 我们传入”this”到单击事件中:

onclick=${this}

并用...处理它

HandleEvent

这是一个非常特殊的函数,它是EcmaScript标准的一部分.If an object has it, 它会作为 obj.handleEvent(e)被调用. 这就意味着我们可以附带一个事件监听器

el.addEventListener('click',Table)

然后单击事件会被传到handleEvent函数中. this 将成为当前对象(不是元素!).在我们处理事件的时候,这可以解决很多典型的问题.关于更多handleEvent的炫酷内容查看下面的连接:

https://medium.com/@WebReflection/dom-handleevent-a-cross-platform-standard-since-year-2000-5bf17287fd38

另外,你也可以使用一个函数去构建你的对象,就像你期待的那样.

https://stackblitz.com/edit/basics-table-3

上面的内容非常相似,唯一一个变化就是我们添加了一个id到这个表中.如果你不想使用classes去实现的话,你可以这么做,而且hyperHTML允许这么做.

之前的看起来都不错,但是如何使用classes呢?你可能会想,也许都差不多吧.

https://stackblitz.com/edit/basics-table-4

现在我们有了一个class,唯一修改的地方 是去调用属性参数,并且传一个id到一个对象的里面.也没什么特别的,就是简单的增强.

同时,hyperHTML也可以使用一个非常简单的方式去创建一个组件.它就是:hyper.Component.这个函数提供给我们一些额外的扩展:

  • state handling(状态处理)

  • default html attribute binded to itself(绑定默认属性)

  • handleEvent, but even easier!(处理事件,甚至更简单)

  • onconnected and ondisconnected functions(连接和断开函数)

  • and more(更多)

关于更多hyper.Component点击下面的链接

https://viperhtml.js.org/hyperhtml/documentation/#components-3

介绍的够多的了,一起看一下具体应用的例子!!

https://stackblitz.com/edit/basics-table-5

首先我们导入Component(组件)到我们的我们的导入中import(就是hyper.Component), 然后我们用这个表去继承它.这个组件Componentclass 会作用于“this.html”,所以我们就移除它.

使用组件去处理事件

我们的处理事件函数在哪?其实组件已经包含了这个处理函数了,所以我们不需要找了!定义组件处理事件就像这样:

this[‘on’+ event.type](e)

这个的意思是:如果你正在监听一个单击事件,handleEvent 将会收到“click”事件的类型并且会调用this.onclick(e),现在我们就有了我们每一个自己的”事件类型”函数 onclick(e){…}.

你甚至可以拥有一个定义处理自定义事件的函数!例如,say you are emitting 一个自定义事件,“enroll”. 你可以附加一个监听器:

onenroll=${this}

然后代替组件去处理它,如下:

onenroll(e){/* do stuff with the enroll event! */}

https://gist.github.com/pinguxx/9c2187b8039c9ab50903b3de31fa1e03#file-custom-event-js

回到这个表中,现在我们有onclick函数,去处理表头上的单击事件和排序功能.

状态值State

注意,我们添加过的 getdefaultState(){...}这个函数.这是个返回初始化状态的函数,如果你还没有设置或者更新状态值,你会得到一个默认值.了解更多请点击documentation

我们也添加了 onclick (sortfunction)函数,和一个调用 setState的函数.SetState 这个函数会更新状态值并且会神奇般的自动地执行渲染.其他的框架会同步更新这个状态,但是由于更新操作在hyperHTML框架种处理的非常快,setState这个函数会立马响应并执行.如果你需要更新几个值,我推荐构造一个对象然后再调用setState(newobj)函数一并更新.例子如下:

https://gist.github.com/pinguxx/62051dc580005a9dbf34d5850a82af46#file-updating-state-js


这次我们看到了很多代码.在坚持一下,其实我们只是刚刚接触到hyperHTML的皮毛.在接下来的部分,我们会学习在一个app中如何使用大量组件,如何去做条件限制渲染和更详细的组件介绍.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • 今天听完了Tom教练口才训练闯关课的认知关,收获很大,从认知上终于认清了什么是好口才,从行动上也迈出了第一步:完成...
    伊谢尔伦魔术师阅读 299评论 2 1
  • 放风筝的孩子扯断了丝线, 让他的快乐越飘越远, 弹吉他的少年听止了弹唱, 叹息的望着四楼那个灯光熄灭的房间! 被风...
    极恶小丑阅读 657评论 11 10
  • 很小,常自问一些奇怪的问题,为什么好多事情我都没得选择?然并卵…… 有着怪异想法的孩子在当时看起来很怪。 成人后,...
    11_18阅读 389评论 0 0