面试题答案
一键面试1. 基于 createMemo
和 createSignal
的基本原理
在 Solid.js 中,createSignal
用于创建一个状态,它返回一个数组,第一个元素是获取状态值的函数,第二个元素是更新状态值的函数。createMemo
用于创建派生状态,它会在其依赖的信号值变化时重新计算。
2. 业务场景分析
假设我们有一个电商购物车的项目,有以下几个组件:
Cart
组件:显示购物车中的商品列表、总价等信息。ProductItem
组件:每个商品项,用户可以在其中增加或减少商品数量。CartSummary
组件:显示购物车商品总数和总价。
3. 状态管理架构设计
创建共享状态
import { createSignal } from 'solid-js';
// 创建购物车商品列表状态
const [cartItems, setCartItems] = createSignal([]);
// 创建商品库存状态(假设为简化示例,所有商品库存固定为10)
const [productStock, setProductStock] = createSignal(10);
处理跨组件的状态依赖
在 ProductItem
组件中,当用户点击增加或减少数量按钮时,需要更新 cartItems
状态,同时 Cart
和 CartSummary
组件依赖于 cartItems
状态来显示最新信息。
import { createSignal, createEffect } from'solid-js';
const ProductItem = ({ product }) => {
const [quantity, setQuantity] = createSignal(1);
const addQuantity = () => {
const stock = productStock();
if (quantity() < stock) {
setQuantity(prev => prev + 1);
const items = cartItems();
const existingIndex = items.findIndex(item => item.id === product.id);
if (existingIndex!== -1) {
items[existingIndex].quantity += 1;
} else {
items.push({...product, quantity: 1 });
}
setCartItems(items);
}
};
const subtractQuantity = () => {
if (quantity() > 1) {
setQuantity(prev => prev - 1);
const items = cartItems();
const existingIndex = items.findIndex(item => item.id === product.id);
if (existingIndex!== -1) {
items[existingIndex].quantity -= 1;
if (items[existingIndex].quantity === 0) {
items.splice(existingIndex, 1);
}
setCartItems(items);
}
}
};
return (
<div>
<p>{product.name}</p>
<button onClick={subtractQuantity}>-</button>
<span>{quantity()}</span>
<button onClick={addQuantity}>+</button>
</div>
);
};
在 Cart
组件中,依赖 cartItems
状态来显示商品列表:
const Cart = () => {
const items = cartItems();
return (
<div>
<h2>Cart</h2>
{items.map(item => (
<div key={item.id}>
<p>{item.name}: {item.quantity}</p>
</div>
))}
</div>
);
};
创建派生状态确保数据一致性
对于 CartSummary
组件,需要根据 cartItems
计算商品总数和总价,这可以通过 createMemo
来创建派生状态。
import { createMemo } from'solid-js';
const CartSummary = () => {
const items = cartItems();
const totalQuantity = createMemo(() => items.reduce((acc, item) => acc + item.quantity, 0));
const totalPrice = createMemo(() => items.reduce((acc, item) => acc + item.price * item.quantity, 0));
return (
<div>
<p>Total Quantity: {totalQuantity()}</p>
<p>Total Price: ${totalPrice()}</p>
</div>
);
};
优化整体架构性能
- 减少不必要的重新计算:
createMemo
只会在其依赖的信号值变化时重新计算。例如在CartSummary
中,totalQuantity
和totalPrice
只依赖cartItems
,只有cartItems
变化时才会重新计算,避免了不必要的性能开销。 - 合理拆分组件:将不同功能的状态和逻辑拆分成独立的组件,每个组件只关心自己依赖的状态,这样当某个状态变化时,只影响相关的组件,而不是整个应用。例如
ProductItem
只关心商品数量的增减和自身的库存逻辑,Cart
和CartSummary
只关心cartItems
的变化。
通过以上设计,可以构建一个可维护、可扩展的状态管理架构,满足在 Solid.js 项目中多个组件之间共享状态并进行状态派生的需求。