面试题答案
一键面试组件间通信方法
- Props 传递
- 说明:这是最基础的方法,适用于父子组件间通信。父组件将数据作为 props 传递给子组件,子组件通过接收这些 props 来获取数据。
- 示例:在父组件中定义数据,如
<ChildComponent data={parentData} />
,子组件通过const { data } = props
来接收。此方法简单直接,但在多层嵌套组件通信时,会导致 props 层层传递,代码繁琐。
- Context
- 说明:用于跨组件层级传递数据,不必在每个中间组件手动传递 props。创建一个 Context,顶层组件提供数据,深层组件可以直接消费该数据。
- 示例:在 Solid.js 中,使用
createContext
创建上下文,Context.Provider
包裹需要共享数据的组件树,并通过value
属性传递数据,消费组件使用Context.Consumer
或useContext
钩子获取数据。适合共享全局数据,如用户认证信息、主题设置等。
- 事件总线
- 说明:通过一个全局的事件中心,组件可以发布事件和订阅事件。当一个组件发布事件时,所有订阅了该事件的组件都会收到通知。
- 示例:可以创建一个简单的事件总线对象,包含
on
(订阅事件)和emit
(发布事件)方法。组件通过eventBus.on('eventName', callback)
订阅事件,eventBus.emit('eventName', data)
发布事件。适用于解耦组件间通信,尤其是不同层级或无直接关联组件间的通信。
利用 Solid.js 特性优化性能避免不必要重渲染
- 细粒度响应式
- 说明:Solid.js 采用细粒度响应式系统,它能精确追踪数据的变化。只有依赖变化数据的部分会被重新渲染,而不是整个组件。
- 实现:使用
createSignal
创建响应式状态,createEffect
包裹依赖该状态的副作用代码。例如,const [count, setCount] = createSignal(0); createEffect(() => { console.log(count()); });
当setCount
被调用时,只有createEffect
内的代码会重新执行,不会导致整个组件重渲染。
- Memoization
- 说明:通过
createMemo
对计算值进行记忆化。如果依赖的值没有变化,createMemo
返回的计算值不会重新计算,从而避免不必要的重计算和可能引发的重渲染。 - 示例:
const expensiveCalculation = createMemo(() => { // 复杂计算 return result; });
只有依赖的数据变化时,expensiveCalculation
才会重新计算。
- 说明:通过
- Memo 组件
- 说明:Solid.js 的
Memo
组件可以包裹子组件,只有当传入的 props 变化时,包裹的子组件才会重新渲染。 - 示例:
<Memo props={propsToCheck}> <ChildComponent /> </Memo>
如果propsToCheck
中的数据没有变化,ChildComponent
不会重渲染。
- 说明:Solid.js 的