یک مؤلفه رتبه بندی ⭐ ستاره با Tailwindcss ایجاد کنید

در این آموزش ، ما یک مؤلفه رتبه بندی ستاره قابل استفاده مجدد با استفاده از React ایجاد خواهیم کرد. این مؤلفه از هر دو حالت تعاملی و فقط خواندنی ، رنگهای سفارشی و جلوه های شناور پشتیبانی می کند.
این نوع مؤلفه ای است که شما اغلب در سایت های تجارت الکترونیک یا برنامه های بررسی مشاهده می کنید.
با عجله؟ فقط کد منبع کامل را بررسی کنید
ویژگی ها و الزامات کلیدی
-
تعامل: مؤلفه بین حالتهای تعاملی و فقط خواندنی بر اساس
readOnly
prop -
اثرات شناور: در حالت تعاملی ، معلق در برابر ستاره ها پیش نمایش رتبه را نشان می دهد.
-
سفارشی سازی: از رنگ ها ، اندازه ها و تعداد ستاره ها پشتیبانی می کند.
-
عمل: استفاده می کند
React.memo
وتuseMemo
برای بهینه سازی عملکرد رندر. -
قابلیت دسترسی: شامل سبک های مکان نما مناسب و بازخورد بصری برای عناصر تعاملی.
مرحله 1: تنظیم رابط مؤلفه
ابتدا بیایید رابط Props را برای مؤلفه خود تعریف کنیم. این به ما کمک می کند تا بفهمیم گزینه های سفارشی سازی مؤلفه ما از چه گزینه های شخصی سازی پشتیبانی خواهد کرد.
interface StarRatingBasicProps {
value: number; // Current rating value
onChange?: (value: number) => void; // Callback when rating changes
className?: string; // Custom CSS classes
iconSize?: number; // Size of star icons
maxStars?: number; // Maximum number of stars
readOnly?: boolean; // Whether rating can be changed
color?: string; // Color of filled stars
}
مرحله 2: ایجاد مؤلفه نماد ستاره
بیایید یک مؤلفه نماد ستاره یاد شده ایجاد کنیم که برای هر ستاره در رتبه بندی استفاده مجدد شود. این به بهینه سازی عملکرد کمک می کند.
const StarIcon = React.memo(({
iconSize,
index,
isInteractive,
onClick,
onMouseEnter,
style,
}: {
index: number;
style: React.CSSProperties;
iconSize: number;
onClick: () => void;
onMouseEnter: () => void;
isInteractive: boolean;
}) => (
<Star
key={index}
size={iconSize}
fill={style.fill}
color={style.color}
onClick={onClick}
onMouseEnter={onMouseEnter}
className={cn(
"transition-colors duration-200",
isInteractive && "cursor-pointer hover:scale-110"
)}
style={style}
/>
));
مرحله 3: تنظیم وضعیت مؤلفه اصلی
حال ، بیایید مؤلفه اصلی را با حالت و پیش فرض های آن تنظیم کنیم:
const StarRating_Basic = ({
className,
color = "#FFD700", // Default gold color
iconSize = 24, // Default size
maxStars = 5, // Default max stars
onChange,
readOnly = false,
value,
}: StarRatingBasicProps) => {
const [hoverRating, setHoverRating] = React.useState<number | null>(null);
من پیش فرض هایی را اضافه کرده ام ، اما مطمئناً می توانید به دلخواه خود تغییر دهید.
مرحله 4: اجرای گیرنده های تعاملی
بیایید گیرنده ها را برای تعامل کلیک و شناور اضافه کنیم. قبل از کلیک رتبه جدید ، به این ترتیب برای ایجاد یک Hover Hover Offect ، به روشی ایجاد می شود.
از آنجا که ما فقط می خواهیم یک امتیاز را در شناور پیش نمایش کنیم ، وقتی ماوس جزء را ترک می کند ، می خواهیم رتبه اصلی را نمایش دهیم. بنابراین ما یک را پیاده سازی می کنیم handleMouseLeave
کنترل کننده برای تنظیم مجدد hoverRating
به null
بشر
دستگیرندگان همچنین باید برای readOnly
شرط برای جلوگیری از به روزرسانی رتبه در صورت لزوم.
const handleStarClick = React.useCallback(
(index: number) => {
if (readOnly || !onChange) return;
const newRating = index + 1;
onChange(newRating);
},
[readOnly, onChange]
);
const handleStarHover = React.useCallback(
(index: number) => {
if (!readOnly) {
setHoverRating(index + 1);
}
},
[readOnly]
);
const handleMouseLeave = React.useCallback(() => {
if (!readOnly) {
setHoverRating(null);
}
}, [readOnly]);
مرحله 5: منطق یک ظاهر طراحی شده ستاره
منطق را برای تعیین ظاهر هر ستاره اضافه کنید:
const getStarStyle = React.useCallback(
(index: number) => {
const ratingToUse =
!readOnly && hoverRating !== null ? hoverRating : value;
return {
color: ratingToUse > index ? color : "gray",
fill: ratingToUse > index ? color : "transparent",
} as React.CSSProperties;
},
[readOnly, hoverRating, value, color]
);
ما یک const اختصاص می دهیم ratingToUse
و سپس ما از چنین متغیری استفاده می کنیم تا مشخص کنیم کدام یک “ستاره” باید داشته باشد.
مرحله ششم: تولید ستاره ها
سپس ، تنها کاری که ما باید انجام دهیم این است که نمادهای ستاره را به عنوان یک آرایه پویا نشان دهیم که لنگه آنها توسط maxStars
prop
بنابراین ما با استفاده از یک ظاهر طراحی شده و تعامل ، مجموعه ای از اجزای ستاره را ایجاد می کنیم:
const stars = React.useMemo(() => {
return Array.from({ length: maxStars }).map((_, index) => {
const style = getStarStyle(index);
return (
<StarIcon
key={index}
index={index}
style={style}
iconSize={iconSize}
onClick={() => handleStarClick(index)}
onMouseEnter={() => handleStarHover(index)}
isInteractive={!readOnly}
/>
);
});
}, [maxStars, getStarStyle, iconSize, handleStarClick, handleStarHover, readOnly]);
مرحله 7: مونتاژ مؤلفه نهایی
سرانجام ، بیایید همه اینها را در بیانیه بازگشت قرار دهیم:
return (
<div
className={cn("flex items-center gap-x-0.5", className)}
onMouseLeave={handleMouseLeave}
>
{stars}
div>
);
مثال استفاده
// Interactive rating
<StarRating_Basic
value={3}
onChange={(newValue) => console.log(`New rating: ${newValue}`)} />
// Read-only rating with custom color
<StarRating_Basic
value={4.5}
readOnly={true}
color="#FF0000"
iconSize={32}
/>
کد منبع کامل + نمونه ها
در اینجا می توانید کد منبع کامل را با مثال دریافت کنید!