hyperHTML wire vs string

时间:2017-12-15 10:13:08

标签: javascript html dom frameworks hyperhtml

我开始使用hyperHTML有一个问题

开始
const data = [1,2,3]

使用电线

hyperHTML.bind(document.getElementById('root'))`
  <h1>Hello, world!</h1>
  ${ data.map( num => hyperHTML.wire()`<li>${num}</li>`  ) }
`;

使用字符串

hyperHTML.bind(document.getElementById('root'))`
  <h1>Hello, world!</h1>
  ${ data.map( num => `<li>${num}</li>`) }
`;

为什么电线更好?

wire没有&#34; id&#34; (obj,string)它将返回一个没有引用的元素

这是documentation,但他们不说为什么人们应该使用电线而不是字符串。

感谢您的帮助

编辑:

只是想...... define更好用吗?类似的东西:

hyperHTML.define(numberListItem, num => `<li>${num}</li>`)

hyperHTML.bind(document.getElementById('root'))`
  <h1>Hello, world!</h1>
  ${ data.map( num => ${{numberListItem: num}}) }
`;

但现在你要填写每个小元素的名称空间:(

1 个答案:

答案 0 :(得分:7)

您的问题中的主要问题是示例本身: 基本列表,在本例中为数字,用作通用元素内容。

这不是一个如此常见的现实世界用例,其中数字来自数据,数据是微弱的可引用的。

但是,如果它只是您想要注入LI元素的少数数字的列表, hyperHTML 可以让您这样做,如果这就是您所需要的,那就去吧。

现在让我试着解释一下你的问题:

为什么电线更好?

hyperHTML 为您提供了一种定义各种内容的方法,包括:

  1. 文本,会自动为您清理
  2. 属性,包括事件
  3. 可以懒惰解决的元素的部分部分
  4. 您可能希望/需要使用 hyperHTML 功能将元素创建为一次性操作。

    表单,输入,按钮,图像,如果你想快速创建一个DOM元素,你可以通过 hyperHTML 来做到这一点,因为它不能锁定你,它更像是一个选择加入抽象/库。

    这就是为什么你可以将一个特定的数据对象与一个电线相关联,但你也可以简单地使用没有引用的电线:它可以用于快速原型设计或少量更改。

    现在让我向您展示一些(减少的)功能列表中的一些示例。

    第1点:文字

    如果不是普通数字而是您有书名列表,那么您的无线代码会产生什么?

    const data = [
      'hyperHTML is the best',
      '<HTML> 5 Best Practices'
    ];
    // without wire
    hyperHTML.bind(document.body)`
      <h1>List of books:</h1>
      <ul>
      ${data.map( text => `<li>${text}</li>` )}
      </ul>`;
    

    答案是,第二本书会导致<HTML>标签导致布局问题,而使用wire()时,标题会按预期显示。

    自动消毒的布局是一次性电线的好处。

    第2点:属性

    考虑这种情况:

    wire()`<input value=${any} disabled=${!editable} onchange=${react}>`
    

    由于以下原因,您无法创建为字符串:

    1. 该值可能包含不需要的字符,因此输出可能会失败
    2. 禁用的属性将在那里,无论你传递什么, 输入将被禁用
    3. onchange事件不会按预期设置
    4. 因此,wire()...是创建元素的更方便的方法。

      第3点:懒惰内容

      const data = [
        'hyperHTML is the best',
        '<HTML> 5 Best Practices'
      ];
      // without wire
      hyperHTML.bind(document.body)`
        <h1>List of books:</h1>
        <ul>
        ${data.map(title => `<li>
          ${title}
          ${fetch(`/books-info.php?title=${encodeURIComponent(title)}`)
            .then(b => b.json())
            .then(info => info.stars)
            .catch(err => 'not available')}
        </li>`)}
        </ul>`;
      

      以上示例将从终点获取星标/费率,并在解决后显示它们。

      随着费率得到解决,布局将被填满。

      关于您的修改

      仅当您表示解决该值的方法时,define方法才有意义。

      使用Array定义键确实是的最佳方式。

      如果您需要反复更新相同的data,则可以将该数据用作参考,并将密钥作为ID传递。

      键/ ID可以是数据的索引,但是与当前列表项无关的信息, 或者更独特的东西,比如书名,或者更一般地说,数据原始内容,假设它是独一无二的。

      您的初始代码将如下所示:

      hyperHTML.bind(document.getElementById('root'))`
        <h1>Hello, world!</h1>
        ${ data.map(
          num => hyperHTML.wire(data, ':' + num)`<li>${num}</li>`
        ) }
      `;
      

      wire()签名确实是接受您想要与某些布局相关的参考对象, 以及布局类型和/或其ID。

      这些都是有效的电话:

      wire()
      wire(info)              // info => (html default) node
      wire(info, 'html')      // info => html node
      wire(info, 'svg')       // info => svg node
      wire(info, ':uid')      // info => (html default) node mapped as uid
      wire(info, 'html:uid')  // info => html node mapped as uid
      wire(info, 'svg:uid')   // info => svg node mapped as uid
      

      使用这些原语,您可以将任何信息列表与特定节点相关联。这是React或Vue关于类固醇的关键概念。

      映射您自己的电线

      如果上述机制都不能满足您的要求,您可以随时创建自己的电线并根据需要使用它们。

      const data = [1,2,3];
      const wires = data.reduce(
        (w, num) => {
          w[num] = wire()`<li>${num}</li>`;
          return w;
        },
        {}
      );
      hyperHTML.bind(document.getElementById('root'))`
        <h1>Hello, world!</h1>
        ${ data.map( num => wires[num]) }
      `;
      

      在上面的示例中,您甚至可以data.sort()并仍然获得正确数字的LI权利。

      真实用例

      我希望你同意最常见的情况是信息来源, 你的data数组经常(如果不是总是)是一个对象数组。

      const data = [
        {title: 'a book', author: 'an author'},
        {title: 'another book', author: 'another author'}
      ];
      

      在这种情况下,您只需连接图书信息,让所有其他内容按预期工作,不会丢弃节点或在野外注入LI

      const {bind, wire} = hyperHTML;
      bind(document.body)`
        <h1>List of books:</h1>
        <ul>
        ${data.map(book => wire(book)`
          <li>
            <strong>${book.title}</strong>
            by ${book.author}
          </li>
        `)}
        </ul>`;
      

      我希望现在很清楚为什么任何人,以及任何库或第三方部件项目都可以从 hyperHTML 线中受益,无论渲染位是 hyperHTML 绑定节点。