当前位置:首页 > 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样式,提升用户体验。

react实现星星评分

.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>
  );
};

添加只读模式

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

react实现星星评分

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>

添加评分变化回调

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

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

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

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

相关文章

vue评分实现

vue评分实现

实现 Vue 评分组件的基本思路 使用 Vue 实现评分功能通常需要以下核心逻辑:通过数据绑定动态渲染星星图标,根据用户交互(点击或悬停)更新评分状态,并支持自定义样式和功能。 基础实现方案 模板部…

vue实现评分星星

vue实现评分星星

Vue 实现评分星星组件 使用 Vue 实现评分星星功能可以通过自定义组件完成,以下是两种常见实现方式: 基础实现(静态评分) <template> <div class="s…

vue实现星星评价

vue实现星星评价

实现星星评价组件 在Vue中实现星星评价功能,可以通过自定义组件完成。以下是一个完整的实现方案: 创建星星评价组件 新建一个StarRating.vue文件,包含以下代码: <templ…

vue实现星级评分效果

vue实现星级评分效果

实现星级评分的基础结构 使用Vue实现星级评分需要构建一个可交互的星级组件。基本思路是通过v-for循环生成星星图标,并通过动态绑定类名或样式来控制选中状态。 <template>…

vue实现批量select评分

vue实现批量select评分

Vue 实现批量 Select 评分 在 Vue 中实现批量 Select 评分功能,可以通过动态生成评分选项并结合 v-model 实现数据绑定。以下是一个完整的实现示例: 基础实现 创建可复用…

vue实现点击星星评分

vue实现点击星星评分

Vue 实现点击星星评分 使用 Vue 实现点击星星评分功能可以通过动态绑定类名和事件处理来实现。以下是一个简单的实现方法: 模板部分 <template> <div c…