使用带有HyperHTML的外部库

时间:2018-02-08 07:07:15

标签: javascript html dom ecmascript-6 hyperhtml

我们希望将HyperHTML集成到聊天应用程序中。

目前,我们使用moment.js和timeago作为上次聊天发布的人类可读时间戳。此外,聊天列表中的最后一次消息预览会频繁更新,但不会像时间戳那样频繁更新。所有这些组件都是单独的,但每个组件都包含在每个聊天中。

因此,将hyperHTML与外部库(如TimeAgo)一起使用,将时间标记附加到DOM,并从DOM渲染,我们想知道最佳实践? 如何在hyperHTML模板文字中使用timeago()函数?

 hyperHTML.bind(document.querySelector('#txtra_chatMessages'))
   <li class="chatEl their-msg" id="i_${results.addedon}">${results.searchResults}${results.sidebar}<\/li>
   //$('#txtra_chatMessages').append(results);
   //$('time.t-ago').timeago();

1 个答案:

答案 0 :(得分:2)

抱歉等待。在回答您的问题之前,我想强调您的示例的一个基本问题:部分ID属性:

id="i_${results.addedon}"
// should be (with or without quotes)
id=${'i_' + results.addedon}

当前的hyperHTML支持no partial attributes,原因很简单,这些只是不必要的逻辑开销。

既然我已经澄清了这个重点,我可以回答你的问题。

外部库和hyperHTML

只要您了解“谁拥有什么”,您就可以轻松地将hyperHTML与您想要的任何项目集成。

这意味着一旦你通过hyperHTML创建内容,无论是通过绑定还是连线,这些内容都不应该被突出的第三部分库操纵。

例如,jQuery slider()是一个突兀的插件,因为它会破坏,替换和污染节点的额外内容,从而干扰hyperHTML逻辑。

为了使其无问题地工作,您可以创建一个容器节点来定位,而不是直接更改用作插值的节点。

您可以看到live example here

timeago插件

在这种情况下,插件不一定是突兀的,您可以这样使用它:

const chat = hyperHTML.bind(
  document.querySelector('#txtra_chatMessages')
)`
  <li
    class="chatEl their-msg"
    id="${'i_' + results.addedon}"
  >
    ${results.searchResults}
    ${results.sidebar}
  <\/li>`;

$('time.t-ago', chat).timeago();

但是,此插件的理想用法是直接在结果中创建文本信息。

const {bind, wire} = hyperHTML;
const chat = bind(
  document.querySelector('#txtra_chatMessages')
)`
  <li
    class="chatEl their-msg"
    id="${'i_' + results.addedon}"
  >
    ${results.searchResults.map(result => wire(result)`
      <span>
        ${result.text}
        (${$.timeago(result.date)})
      </span>`)}
    ${results.sidebar}
  <\/li>`;

在这种情况下,您确信整个内容都是由hyperHTML处理的,并且它立即完成,无需每次都可以遍历聊天并更新每个节点的文本。

总而言之,这是一个理想的场景,因为内容的所有权仍然是hyperHTML,插件功能是无缝集成的

通过绑定或连接将插件集成为内容生成器的另一种方法可以是以下方法:

hyperHTML(document.body)`
  <div>${
    $.magicContent(happen)
  }</div>`;

我希望这个答案在某种程度上有用。

最好的问候

相关问题