이벤트 버스를 사용한 웹 구성 요소 통신
15447 단어 webdevtypescriptwebcomponents
이 때, 당신도 잠재적인 해결 방안을 고려하기 시작합니다. 아마도 응용 프로그램에 상태 관리를 추가할 때가 되었을 것입니다.지금은 맞춤형 솔루션을 구축하기에 좋은 시기입니까?이런 상황에서 디자인 모델을 사용하는 것은 어떻습니까?
이 문제들의 답안은 현재 장면의 복잡성, 개발자의 경험이나 팀의 의견에 달려 있다.분명해, 절대적인 답은 없어!
본고에서 우리는 사용자 정의 이벤트 버스를 사용하여 구성 요소 간의 통신을 실현하는 방법을 소개할 것이다.
이벤트 버스는 무엇입니까?
이벤트 버스 이념은 일반적으로 Publish-subscribe pattern와 관련이 있다.
Publish–subscribe is a messaging pattern where senders of messages, called publishers, do not program the messages to be sent directly to specific receivers, called 'subscribers', but instead, categorize published messages into classes without knowledge of subscribers
다시 말하면 이벤트 버스는 프로그램의 어느 곳에서든 접근할 수 있도록 메시지나 이벤트를 전송하는 전역적인 방식으로 볼 수 있다.
웹 구성 요소 통신
LitElement를 통해 웹 구성 요소를 사용할 때, 보통 그들 사이에서 메시지를 보내는 이벤트를 터치합니다.표준 이벤트나 사용자 정의 이벤트를 사용할 수 있습니다.
new Event('event')
표준 이벤트 트리거new CustomEvent('event', {...options})
사용자 정의 이벤트 트리거서브어셈블리
하위 구성 요소는 사용자 정의 단추로만 정의됩니다.
import { LitElement, html, property, customElement, css } from 'lit-element';
export interface MyButtonEvent {
label: string;
date: string;
}
@customElement('my-button')
class MyButton extends LitElement {
@property({ type: String }) label: string = 'Hello LitElement';
constructor() {
super();
}
render() {
return html`
<span @click=${this.handleClick}>
${this.label}
</span>
`;
}
private handleClick(e: MouseEvent) {
this.dispatchEvent(new Event("myClick"));
}
}
위 코드 세그먼트는 다음을 수행합니다.MyButtonEvent
라는 인터페이스로 정의되었다.@customElement
decorator는 구성 요소의 이름을 사용할 수 있도록 허용합니다: my-button
.그것은 학급 차원에 적용된다.static styles
속성은 태그를 사용한 템플릿 문자(css
)@property
방법은 템플릿 텍스트 (render
를 통해 HTML 내용을 되돌려줍니다.이 함수는 html
속성이 변경될 때 호출됩니다.label
방법을 주의하세요.템플릿에 render()
귀속시키는 것을 사용합니다.클릭 사건 자체를 성명으로 포착할 수 있습니다.모 어셈블리
모 어셈블리는 사용자 정의 버튼 렌더링을 담당하기 때문에 컨테이너로 사용됩니다.다음은 템플릿에서 서브어셈블리를 사용하는 방법입니다.
<my-button label="Show Alert"> </my-button>
그러나 현실 장면에서 하위 사건@click
이 촉발되면 우리는 그것을 처리해야 한다.// my-container.ts
import { LitElement, html, customElement, css } from "lit-element";
import "./my-button";
@customElement("my-container")
class MyContainer extends LitElement {
static styles = css`
:host {
display: block;
}
`;
constructor() {
super();
}
render() {
return html`
<my-button @myClick=${this.handleClick} label="Hello LitElement">
</my-button>
`;
}
private handleClick(e: Event) {
console.log("MyContainer, myClick", e);
}
}
이벤트 버스를 사용하기 전에 앞의 코드 세션에 대한 간략한 설명을 보십시오.myClick
함수는 템플릿 텍스트를 정의하고 render
요소my-button
를 사용합니다. 이것은 HTML 어휘표의 일부분과 같습니다.<my-button></my-button>
속성 설정 함수 인용, 성명성 문법으로 이벤트 처리.@myClick
함수 수신label
대상 및 더 많은 정보.브라우저의 콘솔을 열어 원하는 대로 값을 확인할 수 있습니다.handleClick
방법을 업데이트할 수 있습니다. private handleClick(e: CustomEvent<MyButtonEvent>) {
const detail: MyButtonEvent = e.detail;
// Process the 'detail' object here
}
이벤트 버스 통신
이 예에서, 우리는 부모 구성 요소가 이벤트 버스 대상을 통해 사용하는 모든 이벤트의 '루트' 를 충당할 것이라고 가정할 수 있다.
그리고 구조 함수 방법에
Event
이벤트를 등록합시다.응용 프로그램의 다른 위치에서 경보 메시지를 보여주는 것이 목적이다.// my-container.ts
class MyContainer extends LitElement {
private alertRegistry: Registry;
constructor() {
super();
this.alertRegistry = EventBus.getInstance().register(
'alert',
(message: string) => {
AlertManager.showAlert(message);
}
);
}
}
이벤트를 등록한 후 handleClick
대상을 나중에 로그아웃할 수 있습니다.준비 다 됐어!
다음 단계로, 단추를 눌렀을 때마다
alert
이벤트를 보냅니다.이 작업은 Registry
기능에서 수행할 수 있습니다. // my-container.ts
private handleClick(e: CustomEvent<MyButtonEvent>) {
const detail: MyButtonEvent = e.detail;
EventBus.getInstance().dispatch('alert', `Alert at ${detail.date}`);
}
현재 이벤트 버스는 예상대로 작동합니다.다른 구성 요소에서 다른 이벤트를 등록하거나 할당할 수 있습니다.이러한 이벤트의 통신 채널은 이벤트 버스이기 때문에 어떤 방식으로도 연결할 필요가 없다.이벤트 버스에서 로그아웃
프로그램에 잠재되어 있는 메모리 유출을 피하기 위해 등록된 다양한 이벤트를 추적하는 것은 매우 중요하다.
이 예에서는 처음으로 경고 메시지를 표시하도록 설정합니다.경고 표시 버튼의 다른 클릭은 이벤트 버스를 통해 아무런 효과나 스케줄링 작업이 수행되지 않습니다.
부모 구성 요소를 업데이트합시다.
// my-container.ts
private handleClick(e: CustomEvent<MyButtonEvent>) {
const detail: MyButtonEvent = e.detail;
EventBus.getInstance().dispatch('alert', `Alert at ${detail.date}`);
this.alertRegistry.unregister();
}
alert
방법의 마지막 줄은 이벤트 버스에서 프로세스를 취소할 수 있도록 합니다.따라서 handleClick
이벤트에 대한 다른 호출은 무시됩니다.현장 프레젠테이션
이 코드 한번 해볼래요?내장형 Stackblitz 편집기만 열면 됩니다.
결론
본고에서 나는 두 가지 구성 요소 간에 데이터를 통신하고 전달하는 방법을 묘사했다.
현대 인터넷 컨설팅 회사로 기업의 디지털화 전환을 돕는 데 주력하고 있다.React, Angular, Vue, 웹 구성 요소,GraphQL,Node,Bazel 또는 Polymer에 대한 전문가 구조 지도, 교육 또는 문의는 방문thisdotlabs.com하십시오.
이런 인터넷 매체는 모든 사람을 위해 포용성과 교육적인 네트워크를 만드는 데 전념한다.이벤트, 팟캐스트, 무료 콘텐츠를 통해 현대 인터넷의 최신 진전을 알 수 있습니다.자세한 내용은 thisdot.co를 참조하십시오.
Reference
이 문제에 관하여(이벤트 버스를 사용한 웹 구성 요소 통신), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/thisdotmedia/how-to-implement-an-event-bus-in-typescript-f1d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)