You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SolidJS中onscroll滚动事件无法检测的问题咨询

问题解答

<div onscroll={}> 在SolidJS中完全可以正常工作,你遇到的问题核心是外层div没有产生滚动行为——它的高度默认被内容撑开,没有超出自身容器范围,所以滚动事件不会被触发。

下面提供两种可行的解决办法:

方法一:将外层div设置为可滚动容器

给绑定了onscroll事件的div添加固定高度和溢出属性,让它成为能产生滚动的容器:

import type { Component } from 'solid-js';
import logo from './logo.svg';
import styles from './App.module.css';

const App: Component = () => {
  return (
    <div 
      onscroll={() => console.log("Scroll detected")}
      style={{ height: "100vh", overflow: "auto" }} // 添加滚动容器样式
    >
      <div class={styles.App}>
        <header class={styles.header}>
          <img src={logo} class={styles.logo} alt="logo" />
          <p>
            Edit <code>src/App.tsx</code> and save to reload.
          </p>
          <a
            class={styles.link}
            href="#"
            target="_blank"
            rel="noopener noreferrer"
          >
            Learn Solid
          </a>
        </header>
      </div>
      <div class={styles.App}>
        <header class={styles.header}>
          <img src={logo} class={styles.logo} alt="logo" />
          <p>
            Edit <code>src/App.tsx</code> and save to reload.
          </p>
          <a
            class={styles.link}
            href="#"
            target="_blank"
            rel="noopener noreferrer"
          >
            Learn Solid
          </a>
        </header>
      </div>
    </div>
  );
};

export default App;

设置height: 100vh让容器占满视口高度,overflow: auto会在内容超出时自动显示滚动条,此时滚动容器内部就能触发onscroll事件。

方法二:监听全局window滚动事件

如果需要监听整个页面的滚动行为,可以直接给window添加事件监听,利用SolidJS的生命周期函数管理监听的添加与移除:

import type { Component } from 'solid-js';
import { onMount, onCleanup } from 'solid-js';
import logo from './logo.svg';
import styles from './App.module.css';

const App: Component = () => {
  const handleScroll = () => console.log("Window scroll detected");

  // 组件挂载时添加监听
  onMount(() => {
    window.addEventListener('scroll', handleScroll);
  });

  // 组件卸载时移除监听,避免内存泄漏
  onCleanup(() => {
    window.removeEventListener('scroll', handleScroll);
  });

  return (
    <div>
      <div class={styles.App}>
        <header class={styles.header}>
          <img src={logo} class={styles.logo} alt="logo" />
          <p>
            Edit <code>src/App.tsx</code> and save to reload.
          </p>
          <a
            class={styles.link}
            href="#"
            target="_blank"
            rel="noopener noreferrer"
          >
            Learn Solid
          </a>
        </header>
      </div>
      <div class={styles.App}>
        <header class={styles.header}>
          <img src={logo} class={styles.logo} alt="logo" />
          <p>
            Edit <code>src/App.tsx</code> and save to reload.
          </p>
          <a
            class={styles.link}
            href="#"
            target="_blank"
            rel="noopener noreferrer"
          >
            Learn Solid
          </a>
        </header>
      </div>
    </div>
  );
};

export default App;

这样页面滚动时就会触发对应的事件回调,同时通过onCleanup移除监听,符合组件生命周期的最佳实践。

内容的提问来源于stack exchange,提问作者Praanto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 16:35:04