Skip to main content

跟 DOM 事件不同,组件事件不会 冒泡。如果你想监听更深层嵌套的组件的事件,就得让中间组件来 转发 事件。

在本例中,我们有跟 上一节 中相同的 App.svelteInner.svelte 文件,但是现在 <Inner/> 被嵌套在 Outer.svelte 组件中。

其中一个 可以 解决问题的办法是在 Outer.svelte 中添加 createEventDispatcher,来监听 message 事件,然后创建处理器来处理:

Outer.svelte
<script>
	import Inner from './Inner.svelte';
	import { createEventDispatcher } from 'svelte';

	const dispatch = createEventDispatcher();

	function forward(event) {
		dispatch('message', event.detail);
	}
</script>

<Inner on:message={forward}/>

但这样要写老多代码,因此 Svelte 允许我们使用简写:一个没有值的事件标志 on:message 表示转发所有 message 事件。

Outer.svelte
<script>
	import Inner from './Inner.svelte';
</script>

<Inner on:message/>

Next: DOM 事件转发

1
2
3
4
5
6
7
8
9
10
<script>
	import Outer from './Outer.svelte';
 
	function handleMessage(event) {
		alert(event.detail.text);
	}
</script>
 
<Outer on:message={handleMessage} />
 
initialising