Как сделать HTML в Svelte
Я пытался рендеринга HTML, сохраняя HTML в переменной, но он не работает, я также попробовал тройные фигурные скобки
<script>
let name = 'world';
let val = ""
let ans2 = ""
let ans3;
import showdown from 'showdown';
import validity from 'validity-checker';
function dataSubmit(e){
e.preventDefault();
//ans = validity.isEmoji("ggg");
ans2 = new showdown.Converter();
ans3 = ans2.makeHtml(val)
}
</script>
<div>
<textarea bind:value={val} on:change={dataSubmit}></textarea>
<div>
{{{ans3}}}
</div>
</div>
Возвращаемый тип переменной ans3 похож на "
Hello h1>"
3 ответа
Вы можете использовать {@html expression}
Svelte не очищает выражения перед внедрением HTML.Если данные поступают из ненадежного источника, вы должны очистить их, или вы подвергаете своих пользователей уязвимости XSS.
Обычно строки вставляются как обычный текст, а это означает, что такие символы, как < и >, не имеют специального значения.
Но иногда вам нужно отображать HTML непосредственно в компоненте. Например, слова, которые вы сейчас читаете, существуют в файле уценки, который включается на эту страницу в виде фрагмента HTML.
В Svelte это делается с помощью специального тега {@html ...}:
{@html строка}
Svelte не выполняет никакой очистки выражения внутри {@html ...} до того, как оно будет вставлено в DOM. Другими словами, если вы используете эту функцию, очень важно, чтобы вы вручную избегали HTML, поступающего из источников, которым вы не доверяете, иначе вы рискуете подвергнуть своих пользователей атакам XSS.Как Сатиш и CD... ответили:
Если вы хотите, чтобы svelte отображал объект HTML, созданный вами в JavaScript, просто нужно указать цель и либо установить, либо добавить элемент в качестве дочернего элемента, как показано ниже:
let myComponent = document.createElement('div');
document.getElementById('parent').appendChild(myComponent);
Реактивность еще сохраняется.