当前位置:首页 > React

react实现星星评分

2026-01-26 20:54:33React

实现星星评分组件

使用React实现一个可交互的星星评分组件,可以通过状态管理用户选择的评分值。

import React, { useState } from 'react';

const StarRating = ({ totalStars = 5 }) => {
  const [selectedStars, setSelectedStars] = useState(0);
  const [hoveredStars, setHoveredStars] = useState(0);

  return (
    <div className="star-rating">
      {[...Array(totalStars)].map((_, index) => {
        const starValue = index + 1;
        return (
          <span
            key={starValue}
            className={`star ${starValue <= (hoveredStars || selectedStars) ? 'filled' : ''}`}
            onClick={() => setSelectedStars(starValue)}
            onMouseEnter={() => setHoveredStars(starValue)}
            onMouseLeave={() => setHoveredStars(0)}
          >
            ★
          </span>
        );
      })}
      <p>当前评分: {selectedStars} / {totalStars}</p>
    </div>
  );
};

export default StarRating;

添加样式增强视觉效果

为星星评分组件添加CSS样式,提升用户体验。

.star-rating {
  font-size: 24px;
  display: inline-flex;
}

.star {
  cursor: pointer;
  color: #ccc;
  transition: color 0.2s;
  margin-right: 4px;
}

.star.filled {
  color: #ffc107;
}

.star:hover {
  transform: scale(1.2);
}

支持自定义颜色和大小

扩展组件使其支持自定义颜色和大小属性。

const StarRating = ({ 
  totalStars = 5,
  starColor = '#ffc107',
  emptyColor = '#ccc',
  size = 24 
}) => {
  // ...之前的state逻辑

  return (
    <div className="star-rating" style={{ fontSize: `${size}px` }}>
      {[...Array(totalStars)].map((_, index) => {
        const starValue = index + 1;
        return (
          <span
            key={starValue}
            style={{
              color: starValue <= (hoveredStars || selectedStars) 
                ? starColor 
                : emptyColor
            }}
            className="star"
            // ...事件处理器保持不变
          >
            ★
          </span>
        );
      })}
    </div>
  );
};

添加只读模式

为组件添加只读模式,适用于展示评分而非交互场景。

const StarRating = ({ 
  totalStars = 5,
  rating = 0,
  interactive = true,
  // ...其他props
}) => {
  // ...state逻辑仅在interactive模式下使用
  const [selectedStars, setSelectedStars] = useState(rating);
  const [hoveredStars, setHoveredStars] = useState(0);

  return (
    <div className="star-rating" style={{ fontSize: `${size}px` }}>
      {[...Array(totalStars)].map((_, index) => {
        const starValue = index + 1;
        return (
          <span
            key={starValue}
            style={{
              color: starValue <= (interactive 
                ? (hoveredStars || selectedStars) 
                : rating) 
                ? starColor 
                : emptyColor,
              cursor: interactive ? 'pointer' : 'default'
            }}
            className="star"
            onClick={interactive ? () => setSelectedStars(starValue) : null}
            onMouseEnter={interactive ? () => setHoveredStars(starValue) : null}
            onMouseLeave={interactive ? () => setHoveredStars(0) : null}
          >
            ★
          </span>
        );
      })}
    </div>
  );
};

使用SVG实现更精确的星星形状

替换Unicode字符★为SVG实现更精确的星星形状。

const StarIcon = ({ filled, color, emptyColor }) => (
  <svg
    width="1em"
    height="1em"
    viewBox="0 0 24 24"
    fill={filled ? color : emptyColor}
    stroke={color}
    strokeWidth="1"
  >
    <polygon
      points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"
    />
  </svg>
);

// 在StarRating组件中使用StarIcon替换★字符
<span
  key={starValue}
  // ...其他props
>
  <StarIcon 
    filled={starValue <= (hoveredStars || selectedStars)} 
    color={starColor}
    emptyColor={emptyColor}
  />
</span>

添加评分变化回调

当用户选择评分时触发回调函数。

react实现星星评分

const StarRating = ({
  onRatingChange = () => {},
  // ...其他props
}) => {
  const handleStarClick = (starValue) => {
    setSelectedStars(starValue);
    onRatingChange(starValue);
  };

  // 在star的onClick中使用handleStarClick替代直接setState
  onClick={interactive ? () => handleStarClick(starValue) : null}
};

标签: 评分星星
分享给朋友:

相关文章

vue实现评分

vue实现评分

实现评分功能的基本方法 使用Vue实现评分功能可以通过多种方式完成,常见的方法包括基于组件、自定义指令或第三方库。以下是几种典型实现方案。 基于组件的评分实现 创建一个可复用的评分组件,利用v-fo…

react实现评分功能

react实现评分功能

实现评分功能的方法 在React中实现评分功能可以通过多种方式完成,以下是一些常见的实现方法。 使用第三方库 使用现成的评分组件库可以快速实现功能,例如react-rating或react-star…

js 实现星星打分

js 实现星星打分

实现星星打分功能 使用HTML、CSS和JavaScript可以创建一个交互式的星星打分系统。以下是一个完整的实现方法: HTML结构 <div class="star-rating">…

vue评分实现

vue评分实现

实现 Vue 评分功能 在 Vue 中实现评分功能可以通过自定义组件或使用第三方库完成。以下是两种常见的实现方式: 使用第三方库(如 vue-star-rating) 安装库: npm i…

vue实现星星评分

vue实现星星评分

实现星星评分的基本思路 在Vue中实现星星评分功能,可以通过组件化的方式完成。核心逻辑包括渲染星星图标、处理用户交互以及动态更新评分状态。 创建星星评分组件 创建一个名为StarRating.vue…