Svelte Context在嵌套组件中传递数据时为什么子组件无法获取到值?
我在用Svelte的Context传递数据时遇到了问题。父组件通过setContext设置了值,但三层嵌套后的子组件用getContext获取时一直是undefined,这是怎么回事?
我的结构是这样的:App组件→MainContainer→Content→Child。在App里设置了context,但Child组件获取不到。代码大概是这样的:
import { setContext } from 'svelte';
import MainContainer from './MainContainer.svelte';
setContext('theme', { color: 'blue' });
然后在Child组件里这样写:
import { getContext } from 'svelte';
const theme = getContext('theme'); // 这里返回undefined
当前主题颜色:{theme?.color}
我尝试过把setContext放在onMount里也没用,检查过组件层级没问题,MainContainer和Content都是直接父子关系。是不是需要在中间层组件做些什么?
setContext和getContext必须在组件的生命周期内调用,而且setContext必须在父组件渲染之前生效。你的代码里setContext是在App组件外部调用的,这会导致Context根本没有正确绑定到组件树上。正确的做法是把
setContext放到App组件的顶层逻辑里,确保它在组件渲染时执行。比如这样:这样改完之后,Context就会正确传递到所有子组件了。至于Child组件,你的写法没问题,
getContext('theme')是可以获取到值的。顺便说一句,
onMount里设置Context也不行,因为onMount是在组件挂载后才执行的,而Context需要在组件渲染前就准备好。如果你非得动态更新Context的值,可以考虑用一个可变的对象来存储数据,比如Svelte的writablestore,不过那是另一个话题了。总之记住,
setContext一定要在组件内部调用,并且要在组件渲染之前执行,不然子组件是拿不到值的。希望这个解释能帮你解决问题。setContext的调用位置。Svelte 的 Context 是基于组件树的,如果你在App组件的顶层直接调用setContext,但没有把它包裹在任何组件里,那么子组件是无法正确获取到的。改成这样:
确保
setContext被放置在一个会渲染子组件的上下文中,而不是单纯放在脚本标签里。这样所有嵌套的子组件都能正确获取到值了。