面试题答案
一键面试思路
- 事件委托:由于列表项众多,为每个列表项单独绑定事件处理器会带来性能开销。使用事件委托,将事件绑定在父元素上,通过事件冒泡机制,在父元素上统一处理事件,减少事件处理器的数量。
- 批量更新:Solid.js 提供了批量更新机制,在处理多个状态变化时,使用批量更新可以避免多次触发重新渲染,从而提升性能。
- 防抖与节流:对于某些频繁触发的交互事件(如滚动、窗口大小变化等),使用防抖或节流技术,限制事件触发的频率,减少不必要的计算和渲染。
可能用到的 API
- createSignal:用于创建响应式状态。在处理列表项交互时,通过
createSignal
创建状态来跟踪列表项的相关信息,如选中状态、展开状态等。例如:
import { createSignal } from 'solid-js';
const [selectedIndex, setSelectedIndex] = createSignal(-1);
- on:用于绑定事件。在使用事件委托时,通过
on
将事件绑定到父元素。例如,绑定点击事件到列表父元素:
import { on } from'solid-js';
const handleClick = (e) => {
// 处理点击逻辑
};
on(document.getElementById('list-parent'), 'click', handleClick);
- batch:用于批量更新。当需要同时更新多个状态时,使用
batch
包裹更新操作,确保这些更新在一次渲染中完成。例如:
import { batch } from'solid-js';
const handleListItemClick = (index) => {
batch(() => {
setSelectedIndex(index);
// 其他相关状态更新
});
};
- debounce 和 throttle:虽然 Solid.js 本身没有内置这两个函数,但可以使用第三方库(如
lodash
)来实现防抖和节流。以lodash
为例:
import { debounce } from 'lodash';
const debouncedHandleScroll = debounce(() => {
// 处理滚动逻辑
}, 200);
window.addEventListener('scroll', debouncedHandleScroll);
在 Solid.js 组件中,可以在 onMount
钩子中添加事件监听,在 onCleanup
钩子中移除事件监听,确保事件处理的正确生命周期管理。例如:
import { onMount, onCleanup } from'solid-js';
onMount(() => {
window.addEventListener('scroll', debouncedHandleScroll);
return () => {
window.removeEventListener('scroll', debouncedHandleScroll);
};
});