我正在try 理解在Reaction应用程序中执行事件的顺序.给定以下示例组件,当我单击inner div元素时,为什么要观察到"INNER ELEMENT"之前记录的"OUTER ELEMENT"

我可以看到事件处于冒泡阶段,因此我的理解是它应该从目标元素向上传播,但我观察到的情况正好相反.

我的理解是错误的吗?

export const Test = () => {
    const ref = useRef<HTMLDivElement>(null);

    useEffect(() => {
        const currentRef = ref.current;

        if (!currentRef) {
            return;
        }

        const handler = (e) => {
            console.log("OUTER ELEMENT");
        };

        currentRef.addEventListener("click", handler);

        return () => {
            currentRef.removeEventListener("click", handler);
        };
    });

    return (
        <div ref={ref}>
            <div
                onClick={(event) => {
                    console.log("INNER ELEMENT");
                }}
            >
                INNER
            </div>
            OUTER
        </div>
    );
};

推荐答案

React使用synthetic event系统来修复事件处理中的一些浏览器不一致问题.(另请参阅here.)

在实现级别,我的理解是Reaction实际上是 for each 事件(到document或Reaction根或类似的)附加一个顶级处理程序,然后通过Reaction树将该事件分派到适当的onFoo处理程序.

因此,您不能假设Reaction事件和本机JS事件之间的执行顺序,并且使用Reaction to Impact JS中的Event.stopPropagation这样的函数可能不会按预期工作.(前React经理Sophie Alpert said,"我们不保证Reaction事件和本机事件之间的任何事件顺序.")

Reactjs相关问答推荐

React Context未正确更新

react 挂钩-使用有效澄清

React Router:在没有手动页面刷新的情况下,路由不会更新内容

在数组对象内的数组上进行映射

GitHub页面未正确显示Reaction应用程序网站

无法在REACTION TANSTACK查询中传递参数

react -无法获取函数的最新参数值

生产部署:控制台中 Firebase 无效 api 密钥错误

在reduce()方法上得到NaN

显示我是否加入聊天应用程序时出现问题

单击按钮时如何添加或删除 3d 对象

如何让 useEffect 在 React.JS 中只运行一次?

在 reactJS 中导航时页面重新加载

使用 MuiCssBaseline 在所有 MUI v5 标签上设置边距 0

如何使用样式化函数为 TextField 的输入组件设置样式

如何在 React map 函数循环中使用
标签

为什么接受 useState 返回的函数的 setter 在使用 React 的单个调用中执行两次?

将复杂状态和 setState 传递给更简单的 api

找不到元素 - 这是参考问题吗?

为什么我从另一个组件收到错误?