面试题答案
一键面试1. 信号的作用域管理
- 原则:将信号声明在尽可能小的作用域内,这样只有依赖该信号的组件会在信号变化时更新。
- 示例:
import { createSignal } from 'solid-js';
const App = () => {
// 外层组件信号
const [outerValue, setOuterValue] = createSignal(0);
const InnerComponent = () => {
// 内层组件单独信号,作用域仅限于此组件
const [innerValue, setInnerValue] = createSignal(0);
return (
<div>
<p>Inner Value: {innerValue()}</p>
<button onClick={() => setInnerValue(innerValue() + 1)}>Increment Inner</button>
</div>
);
};
return (
<div>
<p>Outer Value: {outerValue()}</p>
<button onClick={() => setOuterValue(outerValue() + 1)}>Increment Outer</button>
<InnerComponent />
</div>
);
};
export default App;
在此例中,innerValue
的变化不会触发外层组件的重新渲染,反之亦然,因为它们作用域分离。
2. 细粒度的依赖跟踪
- 原则:Solid.js会自动跟踪组件对信号的依赖。确保在函数和计算中,只依赖真正需要的信号,以实现细粒度更新。
- 示例:
import { createSignal, createMemo } from'solid-js';
const App = () => {
const [count, setCount] = createSignal(0);
const [text, setText] = createSignal('');
// 只依赖count的计算
const doubleCount = createMemo(() => count() * 2);
return (
<div>
<p>Count: {count()}</p>
<button onClick={() => setCount(count() + 1)}>Increment Count</button>
<p>Double Count: {doubleCount()}</p>
<input type="text" value={text()} onChange={(e) => setText(e.target.value)} />
{/* 文本输入变化不会影响doubleCount相关部分的重新渲染 */}
</div>
);
};
export default App;
这里 doubleCount
只依赖 count
,text
的变化不会导致 doubleCount
重新计算和相关组件重新渲染。
3. 使用 For
循环优化列表渲染
- 原则:在渲染列表时,使用
For
组件可以让Solid.js更高效地管理列表项的更新,避免不必要的整体列表重新渲染。 - 示例:
import { createSignal } from'solid-js';
import { For } from'solid-js/web';
const App = () => {
const [items, setItems] = createSignal([1, 2, 3]);
const addItem = () => {
setItems([...items(), items().length + 1]);
};
return (
<div>
<For each={items()}>{(item) => <p>{item}</p>}</For>
<button onClick={addItem}>Add Item</button>
</div>
);
};
export default App;
当添加新项时,只有新添加的列表项所在的部分会重新渲染,而不是整个列表。