Разница между конструктором и connectedCallback в пользовательских элементах v1

Я новичок в веб-разработке, и в последнее время я видел много споров и разговоров о Custom Elements v1. Они позволяют вам определять свои собственные элементы с их собственным поведением и, если используется Shadow DOM, с ограниченными стилями.

Когда я узнал об этом в это сайта, я не понял таблицу под "реакциями кастомных элементов". Кто-нибудь может объяснить разницу между использованием «конструктора» и «connectedCallback», а также терминов «создано или обновлено» и «вставлено в DOM»?

Для получения дополнительной информации, определение моего настраиваемого элемента находится в отдельном файле и использует теневую DOM. Я использовал HTML Import, чтобы импортировать определение элемента в основной документ.


person Shashank    schedule 08.11.2016    source источник
comment
конструктор вызывается, если вы делаете что-то вроде var button = document.createElement ('fancy-button'), тогда как connectedCallback будет вызываться только после того, как вы выполните document.body.appendChild (button); То есть он добавляется к элементу в dom.   -  person juvian    schedule 08.11.2016
comment
Что, если мы объявим тег прямо в основном документе как ‹fancy-button› ‹/fancy-button›?   -  person Shashank    schedule 08.11.2016
comment
Кажется, в этом случае нет реальной разницы, за исключением того, что один вызывается раньше другого: jsfiddle.net/ddjvxkpd   -  person juvian    schedule 08.11.2016


Ответы (1)


Как уже сказал Джувиан в комментариях:

  • constructor() вызывается при создании элемента.
  • connectedCallback() вызывается, когда (после) элемент присоединяется к DOM.

Вызов constructor() не специфичен для Пользовательские элементы, это происходит при создании любого объекта (обычно создаваемого с помощью оператора new), а не только HTML-элементов.

В вызове constructor() вы можете создать Shadow DOM, но вы не можете добавлять узлы внутри обычного DOM, а также не можете добавлять или устанавливать атрибуты.

О обновлении:

Обновление происходит, когда неизвестный тег, объявленный в HTML-коде, определяется впоследствии (методом customElements.define()). «Неизвестный» элемент становится «настраиваемым» элементом. Затем вызываются методы constructor() и connectedCallback().

Примечание: когда элемент создается (как неизвестный), а затем определяется, он обновляется только после присоединения.

class CE extends HTMLElement {
  constructor() {
    super()
    console.info( 'constructed' )
  }
  connectedCallback() {
    console.info( 'connected' )
    this.innerHTML = 'Hello'  //can't be set in constructor()
  }
}


B1.onclick = function () {
  ce = document.createElement( 'c-e' )
  ce.textContent = 'unknown'
}

B2.onclick = function () {
  document.body.appendChild( ce )
}

B3.onclick = function () {
  customElements.define( 'c-e', CE)  
}
<button id=B1>create</button>
<button id=B2>attach</button>
<button id=B3>define</button>

Попробуйте разные комбинации с приведенным выше фрагментом:

  • Затем выполните: 1 Создать - 2 Присоединить - 3 Определить
  • Затем выполните: 1 Создать - 2 Определить - 3 Прикрепить
  • Затем выполните: 1 Определить - 2 Создать - 3 Присоединить
person Supersharp    schedule 08.11.2016
comment
В настоящее время в Chrome я могу установить this.innerHTML внутри конструктора. - person kzh; 09.11.2017
comment
@kzh, только если вы определяете настраиваемый элемент после его рендеринга (т.е. обновления неизвестного элемента). это не самый частый вариант использования и не поддерживается спецификацией. - person Supersharp; 10.11.2017
comment
@Supersharp Есть ли простой способ передать значения из HTML в конструктор? Т.е., <button id=B1>create</button> и тогда у конструктора есть доступ к id? Кажется глупым узнавать id только в подключенном обратном вызове - person Big Guy; 09.04.2019
comment
@BigGuy может тебе стоит сформулировать вопрос, я не понимаю, что именно ты хочешь - person Supersharp; 09.04.2019