Web 组件如何相互通信(Lit 框架)?
How web components communicate with each other (Lit framework)?
因此,我尝试让 2 个组件(导航栏和自定义菜单)相互通信,知道菜单不是导航的子项。
在导航中,我有一个汉堡按钮,当我按下它时,我想显示菜单,但我找不到在导航组件中触发信号的方法,以便菜单可以到达它并根据它更改它的样式那个“信号”。
我能让它发生的唯一方法是将菜单放在导航组件中并在那里使用它,但我想让它独立。有什么想法可以实现吗?如何让两个独立的组件使用 Lit 进行通信?
最好的方法是使用 CustomEvents。您需要在 hamburger @click
方法中的 window 元素上分派事件,如下所示:
<my-hamburger
@click="${() => {
window.dispatchEvent(new CustomEvent('hamburger-clicked'));
}">
</my-hamburger>
你当然需要在自定义菜单中监听这个事件,你可以使用 connectedCallback 方法来做到这一点,如下所示:
connectedCallback() {
super.connectedCallback();
window.addEventListener('hamburger-clicked', this.showMenu); // here you need to pass the function responsible for showing menu
}
disconnectedCallback() {
window.removeEventListener('hamburger-clicked', this.showMenu);
super.disconnectedCallback();
}
根据代码和组件结构的描述,我理解如下:
导航容器
- 导航栏
- 自定义菜单
nav-bar和custom-menu,都是Navigation Container的子组件。
您可以做的是需要从导航栏触发自定义事件并收听导航容器。您还需要将自定义菜单中的 属性 传递给 show/hide 菜单,该菜单将根据从导航栏传递给导航容器的自定义事件进行更改。
import {LitElement, html} from 'lit-element';
// your Navigation Continer
class MyElement extends LitElement {
static get properties() {
return {
showHideMenu: {type: Boolean}, //property to be send in menu component
};
}
constructor() {
super();
this.showHideMenu = false;
}
_handleShowHide(e){
// change showHideMenu property on the basis of recieved value
}
render() {
return html`
<nav-bar
@handleShowHideEvent="${this._handleShowHide}"
>
</nav-bar>
<menu
.showhide=${this.showHideMenu}
></menu>
`;
}
}
customElements.define('my-element', MyElement);
你可以参考上面的代码,尽管除此之外还有更多的事情要做。就像您需要调度和 handleShowHideEvent 事件导航栏(在您的菜单上单击)并且您还需要阅读 showhide 属性在您的菜单组件中。
因此,我尝试让 2 个组件(导航栏和自定义菜单)相互通信,知道菜单不是导航的子项。 在导航中,我有一个汉堡按钮,当我按下它时,我想显示菜单,但我找不到在导航组件中触发信号的方法,以便菜单可以到达它并根据它更改它的样式那个“信号”。 我能让它发生的唯一方法是将菜单放在导航组件中并在那里使用它,但我想让它独立。有什么想法可以实现吗?如何让两个独立的组件使用 Lit 进行通信?
最好的方法是使用 CustomEvents。您需要在 hamburger @click
方法中的 window 元素上分派事件,如下所示:
<my-hamburger
@click="${() => {
window.dispatchEvent(new CustomEvent('hamburger-clicked'));
}">
</my-hamburger>
你当然需要在自定义菜单中监听这个事件,你可以使用 connectedCallback 方法来做到这一点,如下所示:
connectedCallback() {
super.connectedCallback();
window.addEventListener('hamburger-clicked', this.showMenu); // here you need to pass the function responsible for showing menu
}
disconnectedCallback() {
window.removeEventListener('hamburger-clicked', this.showMenu);
super.disconnectedCallback();
}
根据代码和组件结构的描述,我理解如下:
导航容器
- 导航栏
- 自定义菜单
nav-bar和custom-menu,都是Navigation Container的子组件。 您可以做的是需要从导航栏触发自定义事件并收听导航容器。您还需要将自定义菜单中的 属性 传递给 show/hide 菜单,该菜单将根据从导航栏传递给导航容器的自定义事件进行更改。
import {LitElement, html} from 'lit-element';
// your Navigation Continer
class MyElement extends LitElement {
static get properties() {
return {
showHideMenu: {type: Boolean}, //property to be send in menu component
};
}
constructor() {
super();
this.showHideMenu = false;
}
_handleShowHide(e){
// change showHideMenu property on the basis of recieved value
}
render() {
return html`
<nav-bar
@handleShowHideEvent="${this._handleShowHide}"
>
</nav-bar>
<menu
.showhide=${this.showHideMenu}
></menu>
`;
}
}
customElements.define('my-element', MyElement);
你可以参考上面的代码,尽管除此之外还有更多的事情要做。就像您需要调度和 handleShowHideEvent 事件导航栏(在您的菜单上单击)并且您还需要阅读 showhide 属性在您的菜单组件中。