React事件学习

84 阅读2分钟

事件

浏览器中发生交互性操作的反应

事件处理

目的:

执行某些副作用:更新页面状态 / 与后端服务器进行交互

规范:

名称以handle 开头,后跟事件名称。

事件处理函数

先定义一个函数,然后将其作为prop 传入合适的 JSX 标签

事件传播

事件会沿着树向上冒泡/传播 => 它从事件开始的地方发生,沿着树向上传播

  • React中事件处理函数会捕获任何来自子组件的事件

  • React中除了onScroll,其余事件都会传播

onScroll

scroll事件是由浏览器引擎实现的,而非JS引擎实现

React为了保持一致性,将onScroll设置为不会冒泡传播

// 如果需要在父级元素上处理onScroll怎么做?-- 使用原生DOM事件监听
const MyComponent = () => {
  const containerRef = useRef(null);
  const handleScroll = (event) => {
    // 在父组件中处理滚动事件的逻辑
  }
  // 在组件挂载时,为元素添加 scroll 事件监听器
  useEffect(() => {
    const container = containerRef.current;
    if (container) {
      container.addEventListener('scroll', handleScroll);
    }   
    // 组件卸载时,移除事件监听器
    return () => {
      if (container) {
        container.removeEventListener('scroll', handleScroll);
      }
    };
  }, []);
  return (
    <div ref={containerRef}>
      {/* 渲染组件的内容 */}
    </div>
  );
}
why addEventListener
  • addEventListener 方法也接受一个可选的第三个参数,该参数指示事件是否应该在捕获或冒泡阶段处理。默认情况下,事件在冒泡阶段处理。如果您想在捕获阶段处理事件,将第三个参数设置为 true
  • 可以为单个元素添加多个事件处理程序,并且可以轻松地将事件处理程序移除。

阻止传播

目的: 阻止触发绑定在外层标签上的事件处理函数

1.不触发其他事件处理程序

2.在event delegation中,将事件处理程序添加到某个祖先元素上,并使用 event.target 属性来检测事件的起源元素,可能需要在事件处理程序中使用 e.stopPropagation() 方法来防止事件继续传播到祖先元素。

应用场景:

1.点击列表项,不希望触发整个列表或者其父级元素上的其他事件

2.弹出式菜单中,防止菜单在点击时被关闭...

方法: e.stopPropagation()

<button onClick={e => {
      e.stopPropagation();
      onClick();
    }}>
      {children}
  </button>

阻止默认行为

目的: 阻止少数事件的默认浏览器行为。

某些浏览器事件具有与事件相关联的默认行为。例如,点击 <form> 表单内部的按钮会触发表单提交事件,默认情况下将重新加载整个页面:

方法: e.preventDefault()