У меня есть различные вопросы о реализации веб-основ, я прочитал, что настоящий веб-компонент должен иметь shadowDOM для инкапсуляции CSS, customElements для логики компонента, который я действительно люблю, и HTML-карты и импорт, так что я пытаюсь сделатьвсе это в компоненте customElement, и я столкнулся со многими и многими проблемами, которые я нахожу действительно сложными для отладки, я включу их все.
- Нужно ли вставлять HTML-шаблон в документ, чтобы на самом делевозьми?я не могу получить его содержимое только от js?и в случае, если мне нужно, когда я собираюсь заменить контент shadowHost, как это работает, я имею в виду, что я получил шаблон (ссылку) внутри shadowRoot, моя проблема в том, что когда я делаю
querySelector(
link [rel = "import "] ).import.querySelector("template")
его нуль после тега функции .import, и когда я вставляю эту функцию в документ, он фактически получает содержимое шаблона, вот документ.
Смотря на скриншот, у меня появилось еще 2 вопроса
Должен ли я использовать shadowHost.innerHTML = file.querySelector(link[rel="import"]).import.querySelector("template")
, чтобы использовать тег и скопировать его содержимое внутри элемента shadowRoot?Я имею в виду, как я могу реализовать этот подход?Я использую Angular в качестве первого примера, они используют HTML-файл (который предполагает, что это шаблон или тег слота), а затем добавляют его в компонент в качестве параметров конструктора, так как с помощью HTMLTemplates и HTMLImport я могу реализовать это поведение, яЯ использовал документированные функции, но он не работает на последнем этапе.
Должен ли я хранить <link rel="import">
внутри shadowRoot или внутри document.head?Могу ли я реализовать шаблон без необходимости добавления его в документ?
Я пытался в течение нескольких дней, чтобы сделать простой customElement с shadowDOM, который работает полностью нормально, проблема в том, что япопробуйте добавить внешнее, чтобы сделать его более устойчивым.
Любое помогает?предложения?я могу показать некоторые функции, которые я использую на компонентах, чтобы иметь представление.
class EgHeader extends HTMLElement {
constructor() {
super();
this.shadowHost = shadowHost.bind(this);
this.shadowStyle = shadowStyle.bind(this);
this.shadowTemplate = shadowTemplate.bind(this);
this.host = this.shadowHost();
}
connectedCallback() {
this.defaultProperties();
let importSelector = this.host.querySelector(`link[rel="import"]`);
console.log(importSelector);
// this.host.appendChild(importSelector.cloneNode(true));
this.host.innerHTML = importSelector.import.querySelector(
"template"
).content;
}
defaultProperties() {
this.getAttributeNames().forEach(key => {
console.log(key);
if (key === "css") {
return this.shadowStyle(this.getAttribute(key));
}
if (key === "template") {
return this.shadowTemplate(this.getAttribute(key));
}
});
}
}
customElements.define("eg-header", EgHeader);
function shadowHost() {
let root = this.attachShadow({
mode: "open"
});
return root;
}
function shadowStyle(stylesheet) {
let link = document.createElement("link");
link.rel = "stylesheet";
link.href = stylesheet + ".css";
this.host.appendChild(link.cloneNode(true));
return link;
}
function shadowTemplate(link) {
var template = document.createElement("link");
template.rel = "import";
template.id = `${link}-template`;
template.href = link + ".html";
document.head.appendChild(template);
this.host.appendChild(template);
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>Page Title</title>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<script src="./Header.js"></script>
<script src="./index.js"></script>
</head>
<body>
<eg-header css="./Header" template="./Header">
</eg-header>
</body>
</html>
// Separated file called Header.html
<template>
<nav>This is X element</nav>
<script>
console.warn("Executed when the template is activated.");
</script>
</template>