#stenciljs
Вопрос:
Я нахожусь в процессе переноса некоторых устаревших страниц в веб-компоненты с помощью StencilJS, поэтому я нахожусь в ситуации, когда некоторые элементы уже обрабатываются с помощью StencilJS, некоторые-нет, и перенос всего займет довольно много времени.
В этом контексте мне нужно иметь возможность обновлять содержимое целевого div, не управляемого с помощью StencilJS, из компонента StencilJS. Этот div находится в совершенно другой ветви DOM, и его невозможно переместить в компонент, не переосмыслив всю страницу.
Поэтому из моего компонента мне нужно уметь делать что-то подобное:
render() {
const target = document.getElementById(this.targetDiv);
if (target) {
target.innerHTML = jsxToString(this.renderDivContents()) // obviously this doesn't work
}
}
renderDivContents() {
return (<p>Some JSX stuff</p>)
}
Итак, другими словами, мне нужно немедленно скомпилировать шаблон JSX в строку. Я не уверен, как это сделать с помощью StencilJS и возможно ли это вообще. У меня сложилось впечатление, что есть способ достичь этого, потому что он очень похож на то, что мы делаем в тестах, но все ресурсы, которые я нахожу по этой теме, предназначены для JSX с React и на самом деле не помогают с StencilJS
Если это неправильный подход, что вы предлагаете? Я знаю, что введение HTML в элемент DOM не идеально, но я просто пытаюсь найти временное решение, чтобы иметь возможность постепенно вносить изменения.
PS: Я знаю, что также могу использовать подход наложения (создать div в компоненте и придать ему ту же позицию и размер, что и целевому div), но это звучит еще уродливее, чем innerHTML. Это не тот ответ, которого я ожидаю.
Комментарии:
1. Я нашел решение, я создаю содержимое в скрытом div внутри компонента, а затем просто копирую его в целевой div, при
componentDidUpdate
этом мне все еще любопытно, можно ли преобразовать шаблон JSX в строку2. Просто идея: вы могли бы делать все, что вы делаете
renderDivContents
в компоненте трафарета, а затем использовать манипуляции DOM для вставки вашего компонента в целевой элемент, например.document.querySelector('#target-div').appendChild('my-component')
…3. Что касается вашего вопроса о превращении шаблона JSX в строку, это нелегко сделать, потому что JSX превращается в кучу вложенных
h(...)
вызовов. Afaik превратить его в строку можно было бы только в том случае, если бы он был во время сборки, что и будет делать рендеринг на стороне сервера. Однако я не уверен, что там что-то открыто как общедоступный API.