javascript - 将 JavaScript 添加到 StenclJS 监听事件
问题描述
当窗口向下滚动时,我想更改组件的背景,我尝试以这种方式实现它,但它不起作用。任何指导都会有所帮助!
export class NewsContainer{
@Listen('scroll', { target: 'window' })
handleScroll(ev) {
var newsContainer= document.querySelector(".newsContainer");
newsContainer.classList.remove("transparentBackground");
newsContainer.classList.add("darkBackground");
}
render(){
return [
<div class="newsContainer transparentBackground">Content</div>
]
}
}
我收到以下错误:
news-container.entry.js:9 Uncaught TypeError: Cannot read property 'classList' of null
at NewsContainer.handleScroll
解决方案
我不时面临的问题是,在元素被渲染并在 DOM 树中可用之前执行了一些钩子或侦听器(调用了渲染函数)。这可能会导致 JavaScript 终止以停止应用程序。我敢打赌,这正是您收到此错误的原因。因此,一个简单的 if 条件就足够了,例如:
@Listen('scroll', { target: 'window' })
handleScroll(ev) {
var newsContainer= document.querySelector(".newsContainer");
if(newsContainer && newsContainer.classList){
newsContainer.classList.remove("transparentBackground");
newsContainer.classList.add("darkBackground");
}
}
我会更进一步并使用引用,因为我认为它看起来更清晰,并且具有您独立于类名的魅力。您可以从每种方法中访问元素并更轻松地进行验证:
export class NewsContainer{
private element;
@Listen('scroll', { target: 'window' })
handleScroll(ev) {
if(!this.element) return;
this.element.classList.remove("transparentBackground");
this.element.classList.add("darkBackground");
}
render(){
return [
<div ref={(el) => {this.element = el}} class="newsContainer transparentBackground">Content</div>
]
}
}
您可以使用this.element
which 引用您的 div 元素。
推荐阅读
- google-cloud-platform - 无法将数据加载到 BigQuery 美国数据集中,但可以加载到东亚数据集中
- css - 什么会导致网站/页面列出字体很棒的图标文件名?
- php - DOMXPath PHP 类名动态变化
- commitizen - 在与代码无关的项目中使用 commitizen
- html - 如何在html中制作高级(对我来说:)进度条?
- c++ - 当双精度为 15 位时,为什么会出现 C++ 双精度数据类型错误
- microsoft-graph-api - 无法将 Teams 机器人添加到频道
- swift - 调整图像视图大小的滑块
- python - Discord 机器人更新消息。(不和谐.py)
- javascript - 在 React Particle 中添加 TSParticles 参数