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

React中onWheel事件条件阻止默认滚动遇preventDefault报错的解决方法

React中解决onWheel事件preventDefault报错的方案

React默认会给onWheel这类滚动相关事件设置passive: true,导致在事件回调里调用preventDefault()时抛出Unable to preventDefault inside passive event listener invocation错误。要解决这个问题,需要手动添加事件监听器并显式设置passive: false,具体实现分两种场景:

函数组件方案

使用useRef获取DOM元素,配合useEffect手动绑定/解绑事件:

import { useEffect, useRef } from 'react';

function YourComponent() {
  const targetDiv = useRef(null);

  const handleWheel = (e) => {
    if (e.ctrlKey) {
      console.log("wheel is called, then want to stop scroll!!");
      e.preventDefault();
      e.stopPropagation();
    }
  };

  useEffect(() => {
    const element = targetDiv.current;
    if (element) {
      element.addEventListener('wheel', handleWheel, { passive: false });
      return () => element.removeEventListener('wheel', handleWheel);
    }
  }, []);

  return <div ref={targetDiv}>这里是需要监听滚轮的内容</div>;
}

类组件方案

在生命周期方法中绑定/解绑事件:

class YourComponent extends React.Component {
  constructor(props) {
    super(props);
    this.targetDiv = React.createRef();
    this.handleWheel = this.handleWheel.bind(this);
  }

  componentDidMount() {
    this.targetDiv.current.addEventListener('wheel', this.handleWheel, { passive: false });
  }

  componentWillUnmount() {
    this.targetDiv.current.removeEventListener('wheel', this.handleWheel);
  }

  handleWheel(e) {
    if (e.ctrlKey) {
      console.log("wheel is called, then want to stop scroll!!");
      e.preventDefault();
      e.stopPropagation();
    }
  }

  render() {
    return <div ref={this.targetDiv}>这里是需要监听滚轮的内容</div>;
  }
}

关键说明

  • 必须通过手动调用addEventListener来设置{ passive: false },因为React的合成事件onWheel不支持直接配置这个参数
  • 务必在组件卸载时移除事件监听器,防止内存泄漏

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 23:07:48