状态结构设计
- 购物车状态:可以使用一个数组来存储购物车中的商品项。每个商品项可以是一个对象,包含商品ID、名称、价格、数量等信息。例如:
const cart = createSignal<{ id: string; name: string; price: number; quantity: number }[]>([]);
- 用户登录状态:使用一个布尔值来表示用户是否已登录,还可以存储用户的基本信息如用户名等。例如:
const isLoggedIn = createSignal(false);
const userInfo = createSignal<{ username: string; email: string } | null>(null);
- 组合状态:如果有多个相关状态,可以将它们组合成一个对象来管理,提高代码的结构性。例如:
const appState = createSignal({
cart: [] as { id: string; name: string; price: number; quantity: number }[],
isLoggedIn: false,
userInfo: null as { username: string; email: string } | null
});
状态更新机制
- 购物车更新:
const addToCart = (product: { id: string; name: string; price: number }) => {
const currentCart = cart();
const existingItem = currentCart.find(item => item.id === product.id);
if (existingItem) {
existingItem.quantity++;
} else {
currentCart.push({ ...product, quantity: 1 });
}
cart(currentCart);
};
const removeFromCart = (productId: string) => {
const currentCart = cart();
const newCart = currentCart.filter(item => item.id!== productId);
cart(newCart);
};
- 用户登录状态更新:
const login = (user: { username: string; email: string }) => {
isLoggedIn(true);
userInfo(user);
};
const logout = () => {
isLoggedIn(false);
userInfo(null);
};
- 使用
batch
进行批量更新:当需要同时更新多个相关状态时,为了提高性能,可以使用batch
。例如:
import { batch } from 'solid-js';
const performComplexUpdate = () => {
batch(() => {
// 同时更新购物车和用户登录状态等多个状态
cart([/* new cart data */]);
isLoggedIn(true);
});
};
处理状态变化带来的副作用
- 自动保存购物车到本地存储:每当购物车状态变化时,将购物车数据保存到本地存储。
createEffect(() => {
const currentCart = cart();
localStorage.setItem('cart', JSON.stringify(currentCart));
});
- 根据登录状态进行导航:当用户登录或登出时,可能需要导航到不同的页面。
import { navigate } from'solid-app-router';
createEffect(() => {
const loggedIn = isLoggedIn();
if (loggedIn) {
navigate('/dashboard');
} else {
navigate('/login');
}
});
- 数据请求副作用:例如,当用户登录后,可能需要自动获取用户的订单历史等数据。
createEffect(() => {
const loggedIn = isLoggedIn();
if (loggedIn) {
fetch('/api/orders')
.then(response => response.json())
.then(data => {
// 处理获取到的订单数据
});
}
});