面试题答案
一键面试1. Redux状态结构设计
在Redux的状态树中,我们至少需要两个部分:
selectedProductType
:用于存储用户在侧边栏选择的商品类型,初始值可以设为一个默认类型,比如null
或某个常见商品类型。
{
selectedProductType: null
}
products
:一个数组,包含所有不同类型的商品数据。每个商品对象应包含能标识其类型的属性(如type
)以及其他商品属性。
{
products: [
{ id: 1, type: '服装', name: 'T恤', price: 50 },
{ id: 2, type: '电子产品', name: '手机', price: 2000 }
]
}
2. Action编写
- 选择商品类型的Action:
- Action类型常量:
const SELECT_PRODUCT_TYPE = 'SELECT_PRODUCT_TYPE';
- Action创建函数:
export const selectProductType = (type) => ({
type: SELECT_PRODUCT_TYPE,
payload: type
});
3. Reducer编写
const initialState = {
selectedProductType: null,
products: []
};
const productReducer = (state = initialState, action) => {
switch (action.type) {
case SELECT_PRODUCT_TYPE:
return {
...state,
selectedProductType: action.payload
};
default:
return state;
}
};
export default productReducer;
4. 在React组件中利用状态管理进行条件渲染
- 侧边栏组件(Sidebar.js):
- 引入
selectProductType
action创建函数。 - 通过
useDispatch
钩子派发selectProductType
action。
- 引入
import React from'react';
import { useDispatch } from'react-redux';
import { selectProductType } from './actions';
const Sidebar = () => {
const dispatch = useDispatch();
const handleTypeChange = (type) => {
dispatch(selectProductType(type));
};
return (
<div>
<button onClick={() => handleTypeChange('服装')}>服装</button>
<button onClick={() => handleTypeChange('电子产品')}>电子产品</button>
</div>
);
};
export default Sidebar;
- 商品展示组件(ProductList.js):
- 引入
useSelector
钩子获取Redux状态。 - 根据
selectedProductType
过滤products
数组,展示符合类型的商品。
- 引入
import React from'react';
import { useSelector } from'react-redux';
const ProductList = () => {
const { selectedProductType, products } = useSelector(state => state);
const filteredProducts = selectedProductType
? products.filter(product => product.type === selectedProductType)
: products;
return (
<div>
{filteredProducts.map(product => (
<div key={product.id}>
<p>{product.name}</p>
<p>{product.price}</p>
</div>
))}
</div>
);
};
export default ProductList;
- 在App.js中组合组件:
import React from'react';
import Sidebar from './Sidebar';
import ProductList from './ProductList';
const App = () => {
return (
<div>
<Sidebar />
<ProductList />
</div>
);
};
export default App;