Lit를 사용한 프레임워크 간 웹 구성요소 라이브러리 📚(2부)
테스트
결론을 내린 후 카드 구성 요소를 테스트할 시간입니다. Open Web Components의 테스트 패키지를 사용했으며 jasmine 및 karma와 함께 설명서here를 찾을 수 있습니다.
테스트할 구성 요소를 설명하고 구성 요소 속성으로 조롱할 항목을 정의하기 시작합니다.
import { Card } from './card';
describe('Card Component', () => {
let el: Card;
const card = {
altText: 'Je suis a image',
ctaText: 'Click me',
image: 'http://example.com/image/',
link: 'http://example.com/link/',
text: 'amazing text',
textDesc: 'other amazing text for test',
textDescLink: 'http://example.com/author/',
title: 'amazing title',
};
}
그런 다음 테스트가 실행되기 전에 사용자 지정 구성으로
Card
구성 요소를 통과하는 고정 장치를 부팅하고 요소가 정의되어 있는지 확인하고 instanceOf
를 확인합니다....
import { assert, expect, fixture, html } from '@open-wc/testing';
describe('Card Component', () => {
...
beforeEach(async () => {
el = await fixture<Card>(html` <card-image .card=${card}></card-image> `);
});
it('is defined', () => {
assert.instanceOf(el, Card);
});
}
모든 것이 잘 구성되었으면 테스트를 실행하고 하나의 성공적인 테스트를 가져야 합니다.
해당 구성 요소에 대해 좀 더 자세히 살펴보겠습니다.
...
describe('Card Component', () => {
...
it('renders the image', () => {
const image = el.shadowRoot?.querySelector('img');
expect(image).to.exist;
expect(image?.alt).to.equal(card.altText);
expect(image?.src).to.equal(card.image);
});
it('renders the title', () => {
const title = el.shadowRoot?.querySelector('#card-link');
expect(title).to.exist;
expect(title?.getAttribute('href')).to.equal(card.link);
expect(title?.textContent).to.equal(card.title);
});
it('renders the text', () => {
const text = el.shadowRoot?.querySelector('p');
expect(text).to.exist;
expect(text?.textContent).to.equal(card.text);
});
it('renders the cta text', () => {
const ctaText = el.shadowRoot?.querySelector('.cta a');
expect(ctaText).to.exist;
expect(ctaText?.textContent).to.equal(card.ctaText);
});
it('renders the description link', () => {
const textDesc = el.shadowRoot?.querySelector('small a');
expect(textDesc).to.exist;
expect(textDesc?.getAttribute('href')).to.equal(card.textDescLink);
expect(textDesc?.textContent).to.equal(card.textDesc);
});
it('dispatch the mousedown event', () => {
el.mouseDown();
expect(el.down).to.be.a('number');
});
}
이것은 적용 범위를 80% 이상으로 활용해야 합니다.
카드 구성요소
여러 카드를 갖도록 구성을 전달할 수 있는 두 번째 구성 요소를 수행할 것입니다.
이렇게 하면 하나의 내부 구성 요소를 재사용하고 다른 구성을 가질 수 있는 다른 용도로 다른 작업을 수행할 수 있는 기능이 노출됩니다. 또한 lit directives 을 사용할 것입니다.
card.ts
와 동일한 수준에서 새 구성 요소를 수행하는 것으로 시작합니다....
import { LitElement } from 'lit';
import { customElement } from 'lit/decorators.js';
@customElement('cards-images')
export class Cards extends LitElement {}
외부
@property
를 정의한 후 기본적으로 CardConfig
개체의 배열을 받습니다....
import { customElement, property } from 'lit/decorators.js';
@customElement('cards-images')
export class Cards extends LitElement {
@property({ type: Array }) cards!: CardConfig[];
}
이제 카드 컨테이너를 렌더링하고
repeat
지시문을 사용하여 @property
에서 전달한 구성을 기반으로 카드의 다양한 인스턴스를 생성할 수 있습니다....
import { html, LitElement } from 'lit';
import { repeat } from 'lit/directives/repeat.js';
@customElement('cards-images')
export class Cards extends LitElement {
...
render() {
return html` <div class="cards">
<ul>
${repeat(this.cards, (current) => html` <card-image .card=${current}></card-image> `)}
</ul>
</div>`;
}
}
마무리하려면 구성 요소 스타일과 공유 스타일만 추가하면 됩니다.
...
import { css, html, LitElement } from 'lit';
import { sharedStyles } from './shared/style';
const componentStyle = css`
.cards > ul {
list-style: none;
margin: 0;
padding: 0;
}
@supports (display: grid) {
.cards > ul {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(15rem, 1fr));
grid-column-gap: 1.5rem;
grid-row-gap: 1.5rem;
}
}
`;
@customElement('cards-images')
export class Cards extends LitElement {
static styles = [sharedStyles, componentStyle];
...
}
이제 다음과 같이 렌더링되는 구성 요소가 있어야 합니다.
다음 부분에서는 npm 레지스트리를 사용하여 노드 패키지를 통해 lib를 배포하고 다양한 프레임워크/libs 환경에서 구성 요소를 사용하는 방법을 다룰 것입니다.
Reference
이 문제에 관하여(Lit를 사용한 프레임워크 간 웹 구성요소 라이브러리 📚(2부)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/fstbraz/cross-framework-components-library-with-web-components-using-lit-part-ii-4a9p텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)