【问题标题】:Using an external library with HyperHTML通过 HyperHTML 使用外部库
【发布时间】:2018-07-18 16:05:55
【问题描述】:

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

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

因此,将 hyperHTML 与将时间标签附加到 DOM 并从 DOM 渲染的外部库(如 TimeAgo)一起使用,我们想知道最佳实践吗? 如何在 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();

【问题讨论】:

    标签: javascript html dom ecmascript-6 hyperhtml


    【解决方案1】:

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

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

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

    现在我已经澄清了这一点,我可以回答你的问题了。

    外部库和超HTML

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

    这意味着一旦您通过超HTML(通过绑定或连线)创建内容,此类内容不应被突兀的第三部分库操作。

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

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

    你可以看到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>`;
    

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

    最好的问候

    【讨论】:

    • 安德烈你真好。我们今天正在处理这个问题,如果有更多内容我会发布。谢谢你。我们密切关注您的工作,并有一段时间。向所有人强烈推荐 HyperHTML。
    猜你喜欢
    • 2018-07-18
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    • 2022-07-02
    • 2021-10-03
    • 2022-01-08
    • 2017-02-12
    相关资源
    最近更新 更多