hyperHTML:循环中的通用内容总是呈现完整并失去它的绑定(点击事件)

hyperHTML: generic content in a loop is always rendered full and lose it's bindings (click events)

我在使用hyperHTML时遇到了一些问题(可能只是一些理解上的问题)。

当我在一个循环中有动态内容时,内容会被完全呈现并失去它的绑定(就像 document.body.innerHTML = content,这不是 hyperHTML 的想法,不是吗?)。请看下面我的例子:

function render() {
  console.log('render');
  
  hyperHTML.bind(document.body) `start:<br>
    ${[1,2,3].map(item => `
      count <button id="testbutton${item}">button${item}</button><br>
    `)}<br>
    press button2<br>
    <button id="testbutton">Test Button</button><br>
    last rendering ${new Date().toTimeString()}`;
}

function init() {
  render();
  let self = this;
  document.querySelector('#testbutton2').addEventListener('click', () => self.render());  
  document.querySelector('#testbutton').addEventListener('click', () => self.render());  
}
window.addEventListener('load', () => init());
<script src="https://webreflection.github.io/hyperHTML/min.js"></script>

第一次点击 button2 内容被渲染。初始绑定仍在工作。再次呈现内容后,侦听器将丢失。

另一边,Test Button 没有再次渲染。绑定仍然存在。

有人可以向我解释一下如何通过遍历列表以正确的方式使用 hypeHTML。

谢谢, 马蒂亚斯

在 hyperHTML 中,基本上有两个实用程序:bind,它在节点内呈现内容,wire,它创建内容。

wire 方法使您能够将其内容与特定对象相关联,而这是您的代码段中缺失的部分。

你确实只是返回一个字符串数组,一个数组作为插值,as described in the documentation,是 html 的明确选择,但它只是处理字符串,而不是 DOM节点.

您还将该字符串用作常规模板文字,而不是 hyperHTML 内容,因为您在野外使用插值,如内部属性,这在 hyperHTML 中是不允许的(阅读文档中的部分属性) .

要一次解决所有这些问题,您只需连接同一个项目(如果它是一个对象)或一个不会改变的引用,例如 hyperHTML 容器本身。

既然你想多次关联内部内容,你需要做的就是使用一个:id这样每N个项目你就会有N个弱关系。

我有 created a Code Pen example 通过对您的原始代码进行极少的更改来显示所有这些。