[React] Composable component with Context
ProductCard component
import './ProductCard.css';
import { ReactNode } from 'react';
import * as React from 'react';
import ProductCardContext from './ProductCardContext';
import { Product } from '../types';
import ProductImage from './ProductImage';
import ProductButton from './ProductButton';
import ProductTitle from './ProductTitle';
import ProductInfo from './ProductInfo';
import ProductCategory from './ProductCategory';
import ProductRating from './ProductRating';
import ProductPrice from './ProductPrice';
type Props = {
product: Product;
image?: ReactNode;
info?: ReactNode;
action?: ReactNode;
};
function ProductCard({ image, info, action, product }: Props) {
return (
<ProductCardContext.Provider value={{ product }}>
<div className="product-card">
{image}
<div className="product-card-bottom">
{info}
{action}
</div>
</div>
</ProductCardContext.Provider>
);
}
ProductCard.Image = ProductImage;
ProductCard.Button = ProductButton;
ProductCard.Title = ProductTitle;
ProductCard.Info = ProductInfo;
ProductCard.Category = ProductCategory;
ProductCard.Rating = ProductRating;
ProductCard.Price = ProductPrice;
export default ProductCard;
Usage:
function App() {
const { addToCart } = useProduct(product);
return (
<ProductCard
product={product}
image={<ProductCard.Image />}
info={
<ProductCard.Info>
<ProductCard.Category />
<ProductCard.Title />
<ProductCard.Rating />
<ProductCard.Price />
</ProductCard.Info>
}
action={
<ProductCard.Button onClick={addToCart}>Add to cart</ProductCard.Button>
}
/>
);
}
Using context inside each compound component:
import * as React from 'react';
import { AiFillStar, AiOutlineStar } from 'react-icons/ai';
import { useProductCardContext } from './ProductCardContext';
function ProductRating() {
const { product } = useProductCardContext();
return (
<div className="product-rating">
{[1, 2, 3, 4, 5].map((i) =>
i <= product.rating.stars ? (
<AiFillStar key={i} />
) : (
<AiOutlineStar key={i} />
)
)}
</div>
);
}
export default ProductRating;
FullCode: https://stackblitz.com/edit/react-ts-uzanui?file=App.tsx
Video: https://www.youtube.com/watch?v=vPRdY87_SH0&list=WL&index=42&t=29s
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2022-03-30 [Typescript] Dealing with union types
2022-03-30 [RxJS] Simplified retryWhen and repeatWhen
2022-03-30 [Javascript] Using Map to set dynamic key and value
2022-03-30 [AWS SAP] Architecture Patterns – Compute
2020-03-30 [Javascript] Finding Sibling Elements
2020-03-30 [Javascript] Finding Parent Elements
2019-03-30 [PureScript] Basic Data Constructors in PureScript