1. 架构设计
- 模块化Store:
- 将每个Redux store设计为独立的模块。每个模块负责管理特定的业务逻辑和状态。例如,在一个电商应用中,可以有产品列表store、购物车store等。这样做可以使代码结构更清晰,易于维护和扩展。
- 在每个store模块中,定义自己的
reducer
、action
和initial state
。以购物车store为例:
// cartSlice.js
import { createSlice } from '@reduxjs/toolkit';
const cartSlice = createSlice({
name: 'cart',
initialState: {
items: [],
totalPrice: 0
},
reducers: {
addItemToCart: (state, action) => {
state.items.push(action.payload);
state.totalPrice += action.payload.price;
},
removeItemFromCart: (state, action) => {
const index = state.items.findIndex(item => item.id === action.payload.id);
if (index!== -1) {
state.totalPrice -= state.items[index].price;
state.items.splice(index, 1);
}
}
}
});
export const { addItemToCart, removeItemFromCart } = cartSlice.actions;
export default cartSlice.reducer;
- 使用
combineReducers
整合Store:
- 在Redux中,使用
combineReducers
将多个独立的reducer合并成一个根reducer。这样整个应用就只有一个单一的store,但内部状态按照各个模块进行组织。
import { combineReducers } from '@reduxjs/toolkit';
import cartReducer from './cartSlice';
import productListReducer from './productListSlice';
const rootReducer = combineReducers({
cart: cartReducer,
productList: productListReducer
});
export default rootReducer;
2. 管理Store之间的通信
- 通过Actions:
- 当一个store的状态变化需要影响另一个store时,可以通过派发特定的action来实现。例如,当购物车中添加了商品,可能需要更新产品列表中该商品的库存状态。
- 在购物车的
addItemToCart
action中,可以额外派发一个更新产品库存的action。
import { useDispatch } from'react-redux';
import { addItemToCart } from './cartSlice';
import { updateProductStock } from './productListSlice';
const dispatch = useDispatch();
const handleAddToCart = (product) => {
dispatch(addItemToCart(product));
dispatch(updateProductStock({ productId: product.id, stock: product.stock - 1 }));
};
- Selector函数:
- 使用selector函数从不同的store模块中获取数据。例如,在一个订单确认页面,可能需要从购物车store中获取商品列表,从用户信息store中获取用户地址等。
import { createSelector } from '@reduxjs/toolkit';
const selectCartItems = state => state.cart.items;
const selectUserAddress = state => state.user.address;
const selectOrderDetails = createSelector(
[selectCartItems, selectUserAddress],
(cartItems, userAddress) => ({
items: cartItems,
address: userAddress
})
);
3. 在Qwik路由变化时更新和同步状态
- 使用Qwik的路由事件:
- Qwik提供了路由事件,如
onRouteChange
。可以在应用的根组件或相关路由组件中监听这些事件。
- 当路由变化时,根据目标路由的需求,从store中获取或更新相应的状态。例如,如果一个路由是产品详情页,需要根据产品ID从产品列表store中获取详细信息并更新到UI。
import { useLocation, onRouteChange } from '@builder.io/qwik';
const MyApp = () => {
const location = useLocation();
onRouteChange(({ to }) => {
if (to.pathname.startsWith('/product/')) {
const productId = to.pathname.split('/')[2];
// 假设这里有一个action来获取产品详情
dispatch(fetchProductDetails(productId));
}
});
return (
// 应用内容
);
};
- Initial State与路由匹配:
- 在每个路由组件的入口,根据路由参数和当前store状态,决定是否需要重新初始化store状态。例如,如果一个用户从购物车页面导航到订单确认页面,订单确认页面可能需要基于购物车当前的状态进行初始化。
- 可以在订单确认页面组件中,使用
useEffect
(在Qwik中类似的生命周期钩子)来检查购物车状态,并进行必要的初始化。
import { useEffect } from '@builder.io/qwik';
import { useSelector } from'react-redux';
const OrderConfirmationPage = () => {
const cartItems = useSelector(state => state.cart.items);
useEffect(() => {
if (cartItems.length === 0) {
// 这里可以导航回购物车页面或显示提示信息
}
}, [cartItems]);
return (
// 订单确认页面内容
);
};