面试题答案
一键面试- 使用上下文(Context API)优化Props传递
- 概念:Svelte提供了
setContext
和getContext
函数来在组件树中共享数据,避免props层层传递。 - 实现步骤:
- 顶层组件:
<!-- TopLevel.svelte --> <script> import { setContext } from'svelte'; const topLevelData = { message: 'Hello from top' }; setContext('topLevelContext', topLevelData); </script> <div> <!-- 子组件树 --> </div>
- 深层子组件:
<!-- DeepChild.svelte --> <script> import { getContext } from'svelte'; const topLevelData = getContext('topLevelContext'); </script> <div>{topLevelData.message}</div>
- 顶层组件:
- 概念:Svelte提供了
- 处理状态管理和数据一致性问题
- 状态管理:
- 响应式数据:确保共享的数据是响应式的。在上述例子中,如果
topLevelData
中的数据需要更新,可将其定义为响应式变量。例如:
在深层子组件中获取并订阅该数据:<!-- TopLevel.svelte --> <script> import { setContext, writable } from'svelte'; const topLevelData = writable({ message: 'Hello from top' }); setContext('topLevelContext', topLevelData); </script> <div> <!-- 子组件树 --> </div>
<!-- DeepChild.svelte --> <script> import { getContext } from'svelte'; const topLevelData = getContext('topLevelContext'); let dataValue; topLevelData.subscribe((value) => { dataValue = value; }); </script> <div>{dataValue.message}</div>
- 集中式状态管理库:对于更复杂的状态管理场景,可以引入如
mobx - svelte
或svelte - store
等库。这些库提供了更强大的状态管理模式,如可观察状态、动作和派生状态等。例如,使用mobx - svelte
:- 安装
mobx - svelte
:npm install mobx - svelte mobx
- 定义store:
// store.js import { makeObservable, observable, action } from'mobx'; class AppStore { constructor() { this.topLevelData = { message: 'Hello from top' }; makeObservable(this, { topLevelData: observable, updateTopLevelData: action }); } updateTopLevelData(newData) { this.topLevelData = newData; } } const appStore = new AppStore(); export default appStore;
- 顶层组件:
<!-- TopLevel.svelte --> <script> import appStore from './store.js'; import { setContext } from'svelte'; setContext('appStoreContext', appStore); </script> <div> <!-- 子组件树 --> </div>
- 深层子组件:
<!-- DeepChild.svelte --> <script> import { getContext } from'svelte'; const appStore = getContext('appStoreContext'); let dataValue = appStore.topLevelData; </script> <div>{dataValue.message}</div>
- 安装
- 响应式数据:确保共享的数据是响应式的。在上述例子中,如果
- 数据一致性:
- 单向数据流:遵循单向数据流原则,尽量避免子组件直接修改共享数据。如果需要修改,通过顶层组件暴露的方法或动作来进行。例如,在上述
mobx - svelte
的例子中,深层子组件如果需要更新topLevelData
,应该调用appStore.updateTopLevelData
方法。 - 数据验证:在数据传递和更新过程中,进行数据验证。可以使用
zod
等库来定义数据模式,并在数据更新时进行验证。例如:- 安装
zod
:npm install zod
- 定义数据模式:
// schema.js import { z } from 'zod'; const topLevelDataSchema = z.object({ message: z.string() }); export default topLevelDataSchema;
- 在更新数据时验证:
// store.js import { makeObservable, observable, action } from'mobx'; import topLevelDataSchema from './schema.js'; class AppStore { constructor() { this.topLevelData = { message: 'Hello from top' }; makeObservable(this, { topLevelData: observable, updateTopLevelData: action }); } updateTopLevelData(newData) { const validationResult = topLevelDataSchema.safeParse(newData); if (validationResult.success) { this.topLevelData = newData; } else { console.error('Data validation failed:', validationResult.error); } } } const appStore = new AppStore(); export default appStore;
- 安装
- 单向数据流:遵循单向数据流原则,尽量避免子组件直接修改共享数据。如果需要修改,通过顶层组件暴露的方法或动作来进行。例如,在上述
- 状态管理: