1. 通过props传递数据(父传子)
- 原理:父组件通过向子组件传递属性(props)来共享数据。
- 代码示例:
<script>
let message = 'Hello from parent';
</script>
<Child {message} />
<script>
import Child from './Child.svelte';
</script>
<script>
export let message;
</script>
<p>{message}</p>
2. 通过事件(子传父)
- 原理:子组件通过
createEventDispatcher
创建事件分发器,然后触发自定义事件,父组件监听这些事件来接收子组件的数据。
- 代码示例:
<script>
function handleChildEvent(data) {
console.log('Received from child:', data);
}
</script>
<Child on:childEvent={handleChildEvent} />
<script>
import Child from './Child.svelte';
</script>
<script>
import { createEventDispatcher } from'svelte';
const dispatch = createEventDispatcher();
function sendDataToParent() {
const data = 'Some data from child';
dispatch('childEvent', data);
}
</script>
<button on:click={sendDataToParent}>Send data to parent</button>
3. 上下文API(适用于多层嵌套组件通信)
- 原理:使用
setContext
在父组件中设置上下文数据,子组件通过getContext
获取该上下文数据,从而实现通信。
- 代码示例:
<script>
import { setContext } from'svelte';
const sharedData = { value: 'Shared context data' };
setContext('sharedContext', sharedData);
</script>
<GrandChild />
<script>
import GrandChild from './GrandChild.svelte';
</script>
<script>
import { getContext } from'svelte';
const sharedData = getContext('sharedContext');
</script>
<p>{sharedData.value}</p>
4. 存储(适用于跨组件通信)
- 原理:使用Svelte的
writable
存储来共享数据,不同组件可以订阅和修改这个存储的值。
- 代码示例:
import { writable } from'svelte/store';
export const sharedStore = writable('Initial value');
<script>
import { sharedStore } from './store.js';
function updateStore() {
sharedStore.update(value => 'New value from Component1');
}
</script>
<button on:click={updateStore}>Update store from Component1</button>
<script>
import { sharedStore } from './store.js';
let value;
sharedStore.subscribe(newValue => {
value = newValue;
});
</script>
<p>{value}</p>