我开始使用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}}) }
`;
但现在你要填写每个小元素的名称空间:(
答案 0 :(得分:7)
您的问题中的主要问题是示例本身: 基本列表,在本例中为数字,用作通用元素内容。
这不是一个如此常见的现实世界用例,其中数字来自数据,数据是微弱的可引用的。
但是,如果它只是您想要注入LI
元素的少数数字的列表, hyperHTML 可以让您这样做,如果这就是您所需要的,那就去吧。
现在让我试着解释一下你的问题:
为什么电线更好?
hyperHTML 为您提供了一种定义各种内容的方法,包括:
您可能希望/需要使用 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}>`
由于以下原因,您无法创建为字符串:
因此,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 绑定节点。