设计思路
- 参数传递:
- 为了使
withProductList
高阶组件能适应不同的API接口,我们可以通过参数传递API的URL。
- 对于排序规则和筛选条件,以函数的形式传递。这样可以灵活定制不同页面的逻辑。
- 性能优化:
- 使用React.memo来包裹被高阶组件包裹的组件,避免不必要的重新渲染。同时,在高阶组件内部,对数据获取和处理的逻辑进行优化,比如使用缓存机制,避免重复获取相同的数据。
核心代码片段
import React from 'react';
import { useState, useEffect } from'react';
// 高阶组件
const withProductList = (WrappedComponent) => {
return (props) => {
const { apiUrl, sortFunction, filterFunction } = props;
const [productList, setProductList] = useState([]);
useEffect(() => {
const fetchData = async () => {
const response = await fetch(apiUrl);
const data = await response.json();
let filteredData = data;
if (filterFunction) {
filteredData = filterFunction(filteredData);
}
let sortedData = filteredData;
if (sortFunction) {
sortedData = sortedData.sort(sortFunction);
}
setProductList(sortedData);
};
fetchData();
}, [apiUrl, sortFunction, filterFunction]);
return <WrappedComponent productList={productList} {...props} />;
};
};
// 示例被包裹组件,使用React.memo进行性能优化
const ProductListPage = React.memo(({ productList }) => {
return (
<div>
<h1>商品列表</h1>
<ul>
{productList.map(product => (
<li key={product.id}>{product.name}</li>
))}
</ul>
</div>
);
});
// 使用高阶组件
const EnhancedProductListPage = withProductList(ProductListPage);
// 调用示例
const App = () => {
const apiUrl = 'https://example.com/api/products';
const sortFunction = (a, b) => a.price - b.price;
const filterFunction = (products) => products.filter(product => product.inStock);
return (
<EnhancedProductListPage
apiUrl={apiUrl}
sortFunction={sortFunction}
filterFunction={filterFunction}
/>
);
};
export default App;