برنامه نویسی

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

در این آموزش ، ما یک مؤلفه رتبه بندی ستاره قابل استفاده مجدد با استفاده از React ایجاد خواهیم کرد. این مؤلفه از هر دو حالت تعاملی و فقط خواندنی ، رنگهای سفارشی و جلوه های شناور پشتیبانی می کند.

این نوع مؤلفه ای است که شما اغلب در سایت های تجارت الکترونیک یا برنامه های بررسی مشاهده می کنید.

با عجله؟ فقط کد منبع کامل را بررسی کنید

ویژگی ها و الزامات کلیدی

  1. تعامل: مؤلفه بین حالتهای تعاملی و فقط خواندنی بر اساس readOnly prop

  2. اثرات شناور: در حالت تعاملی ، معلق در برابر ستاره ها پیش نمایش رتبه را نشان می دهد.

  3. سفارشی سازی: از رنگ ها ، اندازه ها و تعداد ستاره ها پشتیبانی می کند.

  4. عمل: استفاده می کند React.memo وت useMemo برای بهینه سازی عملکرد رندر.

  5. قابلیت دسترسی: شامل سبک های مکان نما مناسب و بازخورد بصری برای عناصر تعاملی.

مرحله 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}
/>
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

کد منبع کامل + نمونه ها

در اینجا می توانید کد منبع کامل را با مثال دریافت کنید!

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا