DOM 事件冒泡与组件通信测试
点击 "子组件1" 分支中的元素。事件会冒泡到 "父组件"。然后父组件会更新 "子组件2" 分支。
父组件
父组件检测到的最后点击来源: 暂无
(点击 "孙组件1A"、"子组件1" 的橙色区域,或 "父组件" 的绿色区域,或下方新增的 "子组件2"、"孙组件2A" 区域)
子组件1
孙组件1A (点击我)
子组件2 (点我试试)
孙组件2A (点我试试)
等待消息...
工作原理:
- 点击 "孙组件1A (点击我)":
Grandchild1AComponent
记录其点击 (1)。- 事件冒泡。
Child1Component
的处理器记录事件 (2)。 - 事件进一步冒泡。
ParentComponent
的处理器记录事件 (3)。 ParentComponent
根据检测到的点击来源更新其状态。- 此状态更改作为 prop 传递给
Child2Component
,然后再传递给Grandchild2AComponent
。 Grandchild2AComponent
重新渲染并显示来自父组件的消息。
- 点击 "子组件1" 的橙色区域 (而非 "孙组件1A"):
Child1Component
的处理器记录其点击 (2)。(Grandchild1A
的处理器不会触发)。- 事件冒泡。
ParentComponent
的处理器记录该事件 (3)。 ParentComponent
更新状态;Grandchild2AComponent
显示来自父组件的消息,指示点击来源于子组件1
。
- 点击 "父组件" 的绿色区域 (在子组件1和子组件2之外):
- 只有
ParentComponent
的处理器记录点击 (3)。 ParentComponent
更新状态;Grandchild2AComponent
显示来自父组件的消息,指示是父组件自身被点击。
- 只有
- 点击 "孙组件2A (点我试试)":
Grandchild2AComponent
记录其点击 (4)。- 事件冒泡。
Child2Component
的处理器记录事件 (5)。 - 事件进一步冒泡。
ParentComponent
的处理器记录事件 (3)。 ParentComponent
更新状态;Grandchild2AComponent
(自身) 会根据父组件传递下来的新消息再次刷新显示。
- 点击 "子组件2 (点我试试)" 的蓝色区域 (而非 "孙组件2A"):
Child2Component
的处理器记录其点击 (5)。- 事件冒泡。
ParentComponent
的处理器记录事件 (3)。 ParentComponent
更新状态;Grandchild2AComponent
会根据父组件传递下来的新消息刷新显示。
- 事件不会直接冒泡到兄弟组件:
- 来自
Grandchild1A
的点击事件不会直接冒泡到Child2Component
或Grandchild2AComponent
。通信是通过共同的祖先组件 (ParentComponent
) 管理状态来实现的。
- 来自
- 阻止冒泡:
- 如果您在
Grandchild1AComponent
的处理器中取消注释e.stopPropagation()
: - 只有 "1. Grandchild1AComponent clicked" 会被记录。
- 事件不会冒泡到
Child1
或Parent
。 - 因此,
ParentComponent
不会收到通知,Grandchild2AComponent
也不会收到关于此特定点击的更新消息。
- 如果您在
请检查浏览器的开发者控制台以获取详细的日志消息。data-id
属性有助于在日志和代码中识别元素。