面试题答案
一键面试1. 跟踪依赖
Solid.js 使用细粒度的依赖跟踪机制。它通过 createSignal
创建响应式数据,在访问信号值的地方会自动建立依赖关系。例如:
import { createSignal } from 'solid-js';
const [count, setCount] = createSignal(0);
function Counter() {
// 这里访问了count信号,建立了依赖
return <div>{count()}</div>;
}
当 setCount
调用更新 count
时,Solid.js 会精确知道哪些组件依赖了 count
,只重新渲染这些依赖的组件,而不是整个应用,从而避免不必要的渲染。
2. 批量更新
Solid.js 会自动批量更新。在事件处理或函数调用等情况下,即使多次触发状态更新,Solid.js 也会将这些更新批量处理,只进行一次实际的 DOM 渲染更新。例如:
import { createSignal } from 'solid-js';
const [count, setCount] = createSignal(0);
function handleClick() {
setCount(count() + 1);
setCount(count() + 1);
setCount(count() + 1);
}
function Counter() {
return (
<div>
<button onClick={handleClick}>Increment</button>
<div>{count()}</div>
</div>
);
}
在 handleClick
函数中多次调用 setCount
,但 Solid.js 会将这些更新合并,只执行一次 DOM 更新,大大提高了性能。
3. 实际项目中解决性能问题示例
假设在一个电商项目中,有一个商品列表和一个购物车。商品列表中的每个商品有添加到购物车的按钮,购物车中显示商品数量和总价。
import { createSignal } from'solid-js';
// 商品列表数据
const products = [
{ id: 1, name: 'Product 1', price: 10 },
{ id: 2, name: 'Product 2', price: 20 }
];
// 购物车相关信号
const [cart, setCart] = createSignal([]);
function addToCart(product) {
setCart([...cart(), product]);
}
function Cart() {
const cartItems = cart();
const total = cartItems.reduce((acc, item) => acc + item.price, 0);
return (
<div>
<h2>Cart</h2>
<ul>
{cartItems.map(item => (
<li key={item.id}>{item.name} - ${item.price}</li>
))}
</ul>
<p>Total: ${total}</p>
</div>
);
}
function ProductList() {
return (
<div>
<h2>Product List</h2>
<ul>
{products.map(product => (
<li key={product.id}>
{product.name} - ${product.price}
<button onClick={() => addToCart(product)}>Add to Cart</button>
</li>
))}
</ul>
</div>
);
}
function App() {
return (
<div>
<ProductList />
<Cart />
</div>
);
}
在这个例子中,当点击商品的“添加到购物车”按钮时,addToCart
函数会更新 cart
信号。由于 Solid.js 的依赖跟踪,只有 Cart
组件会重新渲染,显示更新后的购物车内容,而 ProductList
组件不会重新渲染,避免了不必要的性能开销。同时,多次点击按钮添加商品时,Solid.js 的批量更新机制会合并这些 setCart
操作,减少 DOM 更新次数,提高整体性能。