面试题答案
一键面试基本原理
- 模块级上下文:当在Svelte组件中使用
context="module"
时,会创建一个模块级别的上下文对象。这个上下文对象在整个模块内共享,而不是像普通上下文(非模块级)那样在组件树中传递。 - 作用域与访问:同一模块内的所有组件都可以访问这个上下文对象,无论它们在组件树中的位置关系如何。这意味着即使是深层嵌套的组件,也能直接获取和修改上下文数据,而无需通过多层props传递。例如,假设有一个模块中有多个组件,这些组件可能是兄弟组件,也可能是父子关系较深的组件,它们都能基于这个模块上下文进行通信。
与props传递的不同
- 传递方式
- props传递:是一种自上而下的单向数据流方式。父组件将数据通过props传递给子组件,子组件不能直接修改props数据,若要修改,需通过事件通知父组件,由父组件进行数据变更后再重新传递props。这种方式在组件层级较深时,传递数据会变得繁琐,需要在中间组件层层传递数据,产生所谓的“props drilling”问题。
- context="module":打破了组件树的层级限制,同一模块内组件可直接访问和修改上下文数据,无需中间组件传递。
- 数据流向
- props传递:数据流向清晰且单向,从父到子,便于理解和调试,但对于复杂场景灵活性不足。
- context="module":数据可以在同一模块内任意组件间双向流动,组件既能读取上下文数据,也能修改它,这在一些需要共享状态且状态可能被多个组件修改的场景下非常高效,但可能增加调试难度,因为数据修改来源不唯一。
- 应用场景
- props传递:适用于简单的父子组件间数据传递,数据流动清晰,如展示列表项数据等场景。
- context="module":适用于同一模块内多个组件需要共享和修改某些状态的场景,如模块内全局配置、共享的用户登录状态等。