面试题答案
一键面试- 确保操作顺序:
- 在Solid.js中,
createEffect
会在其依赖的createSignal
变化时自动执行。为了确保操作顺序,我们可以依赖数据的自然流动。例如,库存数量变化会触发更新总库存数的createEffect
,而总库存数变化又会触发调整购物车可购买状态的createEffect
。
- 在Solid.js中,
- 避免无限循环:
- 避免无限循环的关键在于确保每个
createEffect
的依赖是明确且有限的。如果一个createEffect
依赖于某个信号,而这个信号在该createEffect
执行过程中被更新,就可能导致无限循环。在这个场景中,只要每个createEffect
的更新逻辑不会导致依赖信号的无限更新,就不会出现无限循环。
- 避免无限循环的关键在于确保每个
以下是关键代码片段:
import { createSignal, createEffect } from 'solid-js';
// 商品列表,每个商品有库存数量
const products = [
{ id: 1, name: 'Product 1', stock: createSignal(10) },
{ id: 2, name: 'Product 2', stock: createSignal(5) }
];
// 总库存数
const [totalStock, setTotalStock] = createSignal(0);
// 购物车可购买状态
const [canPurchase, setCanPurchase] = createSignal(true);
// 当库存数量变化时,更新总库存数
createEffect(() => {
let sum = 0;
products.forEach(product => {
sum += product.stock();
});
setTotalStock(sum);
});
// 当总库存数变化时,调整购物车的可购买状态
createEffect(() => {
setCanPurchase(totalStock() > 0);
});
在上述代码中:
- 第一个
createEffect
依赖于每个商品的stock
信号,当任何商品的库存数量变化时,会重新计算总库存数并更新totalStock
。 - 第二个
createEffect
依赖于totalStock
信号,当总库存数变化时,会调整购物车的可购买状态canPurchase
。由于每个createEffect
的依赖明确且更新逻辑不会导致无限更新,所以可以正确执行且避免无限循环。