재사용 가능한 화신 웹 구성 요소 만들기
13923 단어 htmlwebcomponentsbeginnersjavascript
구성 요소를 만들어 봅시다.우리는 이 블로그 글 (https://marcoslooten.com/blog/creating-avatars-with-colors-using-the-modulus/) 에서 만든 화신 구성 요소를 다시 만들고 웹 구성 요소로 변환할 것입니다.다음과 같은 메시지가 표시됩니다.
새 웹 구성 요소 만들기
웹 구성 요소에 사용되는 프레임워크가 있지만, 우리는 vanilla JavaScript만 사용하여 프레임워크를 구축할 것입니다.너는 그것을 아바타로 명명하고 싶을지도 모르지만, 이것은 사실상 무효한 명칭이다.원본 HTML 요소와 더 잘 분리하기 위해서는 웹 구성 요소에 대시가 포함되어야 합니다.HTML 요소에 대시가 포함되어 있지 않으므로 대시를 웹 구성 요소의 시각적 단서로 간주할 수 있습니다.우리는 사용자 정의 화신이라고 부른다.계속!
먼저 "CustomAvatar"라는 클래스를 만듭니다. 이 클래스는 HTMLElement를 확장합니다.HTMLElement와 함께 제공되는 다양한 기능에 액세스하려면 확장이 필요합니다.수업이 끝난 후, 우리는 브라우저에 특정한 이름 ("custom-avatar") 과 특정한 클래스 ("CustomAvatar") 를 가진 새로운 사용자 정의 요소가 있음을 알려야 한다.
class CustomAvatar extends HTMLElement {}
window.customElements.define('custom-avatar', CustomAvatar);
클래스 이름(Custom Avatar)은 우리가 원하는 모든 이름일 수 있지만, 사용자 정의 요소와 같은 이름을 사용하지만,kebab cased가 아닌 Pascal Case를 사용합니다.이제 태그를 HTML: <custom-avatar></custom-avatar>
에 추가할 수 있습니다.아직 볼 게 없어요.화신처럼 보이게 하자!웹 구성 요소에 HTML 및 CSS 추가
CustomAvatar 클래스에서는 구조 함수를 사용합니다.이 방법은 구성 요소를 초기화할 때 호출되며 태그와 스타일 설정에 사용할 수 있습니다.또한 Super () 를 호출합니다. HTML Element에서 모든 방법과 속성을 상속해야 합니다.
class CustomAvatar extends HTMLElement {
constructor() {
super();
}
}
window.customElements.define('custom-avatar', CustomAvatar);
이제 그림자 DOM을 사용합니다.이것은 웹 구성 요소의 봉인 부분입니다. 웹 구성 요소 자체만 변경할 수 있습니다.이것은 웹 구성 요소가 주변 환경의 영향을 받지 않는다는 것을 의미합니다.내 웹 구성 요소에 h1 표시가 있고 일반적인 스타일 <style>h1 { background: hotpink}</style>
을 사용한다고 가정하십시오.페이지 주위에 스타일이 있는 h1이 있어도 웹 구성 요소의 h1에 영향을 주지 않습니다.이제 재미있는 일이 시작되었습니다. 우리는 표식을 그림자 DOM에 추가할 수 있습니다.나는 각 단계의 작용을 설명하기 위해 약간의 주석을 추가했다.
class CustomAvatar extends HTMLElement {
constructor() {
super();
// Enable the shadow DOM for this component
this.attachShadow({ mode: 'open' });
// Create a HTML template (this is a special tag which can hold markup)
const template = document.createElement('template');
// Set the innerHTML to the actual markup we want
template.innerHTML = `<div class="avatar"></div>`;
// Create a style element
const styles = document.createElement('style');
// Inside the style element, add all the CSS
styles.textContent = `
.avatar {
width: 52px;
height: 52px;
display: flex;
align-items: center;
justify-content: center;
background-color: hotpink;
border-radius: 50%;
font-family: sans-serif;
color: #fff;
font-weight: bold;
font-size: 16px;
}
`;
// Append the style element to the shadow DOM
// shadowRoot is the wrapper of our component
this.shadowRoot.appendChild(styles);
// Take the template contents, and copy them to the shadow DOM
this.shadowRoot.appendChild(template.content.cloneNode(true));
}
}
지금 너는 페이지에서 분홍색 동그라미를 보아야 한다.우리는 진전이 있다!사용자 데이터 전송을 위한 속성 추가
props나 @Input () 또는 React나 Angular 같은 프레임워크를 사용하는 것이 아니라 일반적인 HTML 속성을 사용하여 구성 요소에 데이터를 전달합니다.우리는 알파벳만 있으면 이렇게 화신을 사용할 수 있다.
<custom-avatar initials="MJ"></custom-avatar>
.이렇게 하면 this.getAttribute('initials')
과 같은 JavaScript 액세스 속성을 사용할 수 있습니다.일부 웹 구성 요소 예시에서 구조 함수의 속성을 검색할 수 있지만, 이것은 나쁜 방법입니다. (여기 규범: https://html.spec.whatwg.org/multipage/custom-elements.html#custom-element-conformance 참조)connectedCallback
에서 이 동작을 실행하는 것이 좋습니다. 구성 요소를 불러올 때 호출합니다.더 좋은 것은
attributesChangedCallback
이다.속성을 업데이트할 때마다 이 방법을 호출합니다.다행히도, 구성 요소가 처음 불러올 때, 그것들도 변화할 것이다.속성의 초기 값은 null
입니다. 준비가 되면 속성을 제공하는 값으로 설정합니다.attributesChangedCallback
은name,oldValue,newValue 세 가지 인자를 받아들입니다.너무 잘 어울려요!이것은 초기 값을 얻기에 좋은 곳일 뿐만 아니라, 값이 변하면, 다시 실행될 수도 있다. (우리의 화신을 위해 새로운 색을 가져와야 한다.)구조 함수 외에 다음 코드를 추가합니다.// This is our code to generate a color code from a string
// For more info, see the blog about this technique:
// https://marcoslooten.com/blog/creating-avatars-with-colors-using-the-modulus/
getColorFromText(text) {
const colors = ['#00AA55', '#009FD4', '#B381B3', '#939393', '#E3BC00', '#D47500', '#DC2A2A'];
const charCodes = text
.split('')
.map(char => char.charCodeAt(0))
.join('');
return colors[parseInt(charCodes, 10) % colors.length];
}
// This static get is needed to tell our component which attributes to watch
// If you don't provide this, it won't work
static get observedAttributes() {
return ['initials'];
}
// This will run only when our 'initials' attribute changes
attributeChangedCallback(name, oldValue, newValue) {
// But for future-proofing, I'd like to check anyway
if(name === 'initials') {
// Get the avatar div from the shadow DOM:
const avatar = this.shadowRoot.querySelector('.avatar');
// Set the text to the attribute value:
avatar.innerText = newValue;
// And set the background color to the color from the getColorFromText method
avatar.style.backgroundColor = this.getColorFromText(newValue);
}
}
웹 구성 요소 만들기
이제 당신은 간단한 웹 구성 요소를 만드는 방법을 알고 있습니다!우리는 먼저 HTML Element를 확장하는 클래스를 만들고 DOM에 사용자 정의 요소가 있음을 알려 줍니다.그런 다음 구조 함수에서 기본 태그와 반환 배경색을 사용하여 어셈블리를 초기화합니다.우리가 사용하는 DOM 방법은 이미 오랫동안 존재해 왔으니 당신은 이미 익숙해졌을 것입니다.마지막으로 웹 구성 요소의 내장 생명주기 방법 중 하나를 사용했습니다. 이 예에서attributeChangedCallback은 우리의 속성을 설정하거나 업데이트할 때 터치합니다.
웹 구성 요소를 연구할 때, 나는 그것이 얼마나 간단한지 놀랐다.전체 프레임워크에 비해 상대적으로 작은 API일 뿐, Angular나 React보다 더 빨리 학습할 수 있습니다.그러나 만약 당신이 막 시작한다면 문법이 좀 서투르다고 느낄 수 있습니다.또한 DOM 작업(query Selector,create Element,inner HTML,inner Text 등)에 능통하면 웹 구성 요소를 작성하기 시작하면 이런 작업이 많기 때문에 정말 도움이 됩니다.
마지막으로, 그것은 아마도 매우 배울 만한 가치가 있을 것이다.나는 몇몇 대기업들이 갈수록 이 기술을 채택하는 것을 보았다.어떤 프레임워크를 사용하든지 간에 그들은 팀 간에 구성 요소를 공유할 수 있다.많은 사람들에게 이것은 거대한 승리이다.같은 구성 요소를 사용해야 하지만 다른 프레임워크로 세 개의 구성 요소 라이브러리를 업데이트해야 한다고 상상해 보세요.
웹 구성 요소에 대한 정보를 더 알고 싶으면 다음 자원을 보십시오.
The Ultimate Guide to Web Components
Lifecycle Hooks in Web Components
webcomponents.org
Reference
이 문제에 관하여(재사용 가능한 화신 웹 구성 요소 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/marcoslooten/creating-a-reusable-avatar-web-component-2681텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)