如何将 hyperHTML.wire() 与 string/number 作为 id 而不是对象一起使用?
How to use hyperHTML.wire() with a string/number as id instead of an object?
我有一组玩家:{id: string; name: string}[] 当有新玩家可用时由 firebase 更新。
这每次都会提供一个新的玩家数组,其中包含新的玩家对象,但具有相同的 ID。
因为我想在玩家 added/removed 时对元素进行动画处理,所以我想重用基于 player.id 的元素。
AFAIK 你只能将对象传递给 wire 函数而不是 player.id (字符串)。有什么办法可以实现吗?
const playerEls = players.map((p, i) => hyperHTML.wire(p.id)`<div class="player" style="${`transform: translateY(${i * 20}px);`}">${p.name}</div>`);
hyperHtml.bind(document.body)`<h1>Players</h1>${playerEls}`
在这里你可以找到一个代码笔来玩:https://codepen.io/jovdb/pen/rdOzvY
我也尝试过使用 hyperHTML.wire(p, ':player-' + p.id)
,但会重新创建所有元素。
请允许我为您解答。
you can only pass an object to the wire function and not the player.id (string)
你的例子完美地解释了为什么原语不是关联有线节点的好方法。
假设您在那个 players.map((p, i) => ...)
回调中使用 i
索引,而不是 p.id
,或者假设应用程序的任何其他部分将使用通用数字。
需要对象来授予关系的唯一性,您确实非常接近解决方案。
I've also tried to us hyperHTML.wire(p, ':player-' + p.id), but that recreates all elements.
如果您考虑一下,玩家与其实时 DOM 表示之间的关系就是它的容器,它永远不会改变,并且不同于任何其他代表不同玩家信息的容器。
const view = document.querySelector("section");
hyperHTML.wire(view, `:player-${p.id}`)`...`
给你。正如您在 this fork of your Code Pen 中看到的,现在每个玩家的每个 ID 都是独一无二的。
希望我已经回答了您的问题。
问候。
我有一组玩家:{id: string; name: string}[] 当有新玩家可用时由 firebase 更新。 这每次都会提供一个新的玩家数组,其中包含新的玩家对象,但具有相同的 ID。
因为我想在玩家 added/removed 时对元素进行动画处理,所以我想重用基于 player.id 的元素。
AFAIK 你只能将对象传递给 wire 函数而不是 player.id (字符串)。有什么办法可以实现吗?
const playerEls = players.map((p, i) => hyperHTML.wire(p.id)`<div class="player" style="${`transform: translateY(${i * 20}px);`}">${p.name}</div>`);
hyperHtml.bind(document.body)`<h1>Players</h1>${playerEls}`
在这里你可以找到一个代码笔来玩:https://codepen.io/jovdb/pen/rdOzvY
我也尝试过使用 hyperHTML.wire(p, ':player-' + p.id)
,但会重新创建所有元素。
请允许我为您解答。
you can only pass an object to the wire function and not the player.id (string)
你的例子完美地解释了为什么原语不是关联有线节点的好方法。
假设您在那个 players.map((p, i) => ...)
回调中使用 i
索引,而不是 p.id
,或者假设应用程序的任何其他部分将使用通用数字。
需要对象来授予关系的唯一性,您确实非常接近解决方案。
I've also tried to us hyperHTML.wire(p, ':player-' + p.id), but that recreates all elements.
如果您考虑一下,玩家与其实时 DOM 表示之间的关系就是它的容器,它永远不会改变,并且不同于任何其他代表不同玩家信息的容器。
const view = document.querySelector("section");
hyperHTML.wire(view, `:player-${p.id}`)`...`
给你。正如您在 this fork of your Code Pen 中看到的,现在每个玩家的每个 ID 都是独一无二的。
希望我已经回答了您的问题。 问候。