Svelte递归组件中,为何已有<slot item={item} />仍需<slot item={child} />?
问题解析
1. 移除<slot item={child} />后子项不显示的原因
核心逻辑在于Svelte递归组件的slot传递规则:
- 顶层
Tree组件的slot内容(比如App里渲染{item.name}的模板)由App组件提供,但递归调用的svelte:self是独立的组件实例,不会自动继承父级Tree的slot模板。 - 原代码中
<slot item={child} />的作用是:将当前Tree组件收到的slot模板,传递给递归的子Tree实例,并把child作为slot的itemprops。如果移除这一行,递归的子Tree实例的slot没有任何模板内容,哪怕它们的<slot item={item} />存在,也无法渲染出子项的内容——因为没有可执行的渲染模板。 - 你看到
console.log能打印所有子项,只是说明递归逻辑走到了子节点,组件实例的item属性正确,但没有模板来渲染这些数据,所以页面上看不到。
2. <slot item={child} />的调用时机
它不是等到最后一个子对象才触发,而是在遍历每个子节点、创建对应的递归svelte:self实例时,就会执行。每一个子节点的递归组件实例都会通过这行代码获取到slot模板和对应的child数据,进而渲染出子项内容。
内容的提问来源于stack exchange,提问作者poyango
相关产品推荐
相关产品推荐

