Я добавил это в ответ, поскольку @ tony19 предполагал, что его можно правильно отформатировать.Я на самом деле не задавал отдельный вопрос, на самом деле просто задавал риторический вопрос, а не предлагал отдельное решение.
Вы можете немного упростить подход, так как подсвеченный позволяет вам создавать HTML в слоях черезmap
function.
render() {
return html`
<div>${this.item.snippets.map(s => s.matches.map(m =>
html`<div>${this.sanitizeHtml(m.text)}</div>`
))}
</div>
`;
}
Теперь одна проблема с этим (и принятым ответом) заключается в том, что при каждом рендеринге вы пересчитываете все это, включая очистку HTML.lit-html
имеет директиву guard
, которая может помочь с этим.Добавление этого обеспечит повторный рендеринг только при изменении.
render() {
return html`
<div>${guard(this.item.snippets, () => this.item.snippets.map(s =>
guard(s.matches, () => s.matches.map(m =>
html`<div>${this.sanitizeHtml(m.text)}</div>`
))))}
</div>
`;
}
Это требует от вас определенной дисциплины в отношении того, как this.item.snippets
и базовый matches
обновляются.Необходимо убедиться, что используемые ссылки «Массив» изменяются при обновлении.Примерно так (при условии, что совпадения обновляются с новым совпадением), sindex
- это индекс snippet
, который вы хотите обновить, и mindex
- это индекс match
в пределах этого snippet
, которым вы являетесь.обновление с newMatch
;
this.items.snippets = this.items.snippets.map((snippet, index) => index === sindex ?
{...snippet, matches: snippet.matches.map((match, index) => index === mindex ?
newMatch : match)} : snippet);