我正在尝试从使用 StencilJS 制作的组件中安全地删除 DOM 节点。
我已将删除代码放在公共方法中 - 这就是我需要的。
但是,根据调用此方法的时间,我遇到了问题。如果调用得太早,它还没有 DOM 节点引用——它是undefined
.
下面的代码显示了组件代码(使用 StencilJS)和 HTML 页面。
调用alert.dismiss()
页面脚本是有问题的。单击按钮调用相同的方法可以正常工作。
有一种安全的方法可以做到这一点remove()
吗?StencilJS 是否提供一些资源,我应该测试还是应该等待?
import {
Component,
Element,
h,
Method
} from '@stencil/core';
@Component({
tag: 'my-alert',
scoped: true
})
export class Alert {
// Reference to dismiss button
dismissButton: HTMLButtonElement;
/**
* StencilJS lifecycle methods
*/
componentDidLoad() {
// Dismiss button click handler
this.dismissButton.addEventListener('click', () => this.dismiss());
}
// If this method is called from "click" event (handler above), everything is ok.
// If it is called from a script executed on the page, this.dismissButton may be undefined.
@Method()
async dismiss() {
// Remove button from DOM
// ** But this.dismissButton is undefined before `render` **
this.dismissButton.remove();
}
render() {
return (
<div>
<slot/>
<button ref={el => this.dismissButton = el as HTMLButtonElement} >
Dismiss
</button>
</div>
);
}
}
<!DOCTYPE html>
<html lang="pt-br">
<head>
<title>App</title>
</head>
<body>
<my-alert>Can be dismissed.</my-alert>
<script type="module">
import { defineCustomElements } from './node_modules/my-alert/alert.js';
defineCustomElements();
(async () => {
await customElements.whenDefined('my-alert');
let alert = document.querySelector('my-alert');
// ** Throw an error, because `this.dismissButton`
// is undefined at this moment.
await alert.dismiss();
})();
</script>
</body>
</html>