StarRating

View source
交互式星级评分组件

简介

MStarRating 是一个功能丰富的星级评分组件。支持整星和半星评分、只读展示、自定义星星数量等多种模式,适用于评价、评级等场景。

基于 Nuxt UI 的 Button 和 Badge 组件构建

基础用法

默认 5 星评分系统:

3/5
<script setup lang="ts">
const rating = ref(3)
</script>

<template>
  <MStarRating v-model="rating" />
</template>

自定义星星数量

通过 max 设置星星总数:

7/10
<script setup lang="ts">
const rating = ref(7)
</script>

<template>
  <MStarRating v-model="rating" :max="10" />
</template>

只读模式

用于展示评分结果,不可交互:

4.5/5
<script setup lang="ts">
const productRating = ref(4.5)
</script>

<template>
  <MStarRating :model-value="productRating" readonly />
</template>

半星评分

通过 allow-half 启用半星评分:

3.5/5
<script setup lang="ts">
const rating = ref(3.5)
</script>

<template>
  <MStarRating v-model="rating" allow-half />
</template>

可清除评分

通过 clearable 允许点击已选星星清除评分:

4/5
<script setup lang="ts">
const rating = ref(4)
</script>

<template>
  <MStarRating v-model="rating" clearable />
</template>

隐藏评分徽章

通过 show-badge 控制评分数字徽章的显示:

显示徽章
3/5
隐藏徽章
<script setup lang="ts">
const rating = ref(3)
</script>

<template>
  <div class="flex flex-col gap-4">
    <div>
      <div class="text-sm text-gray-500 mb-2">
        显示徽章
      </div>
      <MStarRating v-model="rating" :show-badge="true" />
    </div>

    <div>
      <div class="text-sm text-gray-500 mb-2">
        隐藏徽章
      </div>
      <MStarRating v-model="rating" :show-badge="false" />
    </div>
  </div>
</template>

不同尺寸

通过 size 调整星星大小:

4/5
4/5
4/5
4/5
<script setup lang="ts">
const rating = ref(4)
</script>

<template>
  <div class="flex flex-col gap-4">
    <MStarRating v-model="rating" size="xs" />
    <MStarRating v-model="rating" size="sm" />
    <MStarRating v-model="rating" size="md" />
    <MStarRating v-model="rating" size="lg" />
  </div>
</template>

自定义颜色

通过 color 设置选中星星的颜色:

4/5
4/5
4/5
<script setup lang="ts">
const rating = ref(4)
</script>

<template>
  <div class="flex flex-col gap-4">
    <MStarRating v-model="rating" color="error" />
    <MStarRating v-model="rating" color="success" />
    <MStarRating v-model="rating" color="primary" />
  </div>
</template>

自定义图标

通过图标属性使用不同的图标样式:

3/5
<script setup lang="ts">
const rating = ref(3)
</script>

<template>
  <MStarRating
    v-model="rating"
    filled-icon="i-lucide-heart"
    empty-icon="i-lucide-heart"
    half-icon="i-lucide-heart"
    color="error"
  />
</template>

事件监听

通过事件监听评分和悬停状态:

当前评分: 0
悬停星级: -
<script setup lang="ts">
const toast = useToast()
const rating = ref(0)
const hovering = ref<number | null>(null)

function handleChange(value: number) {
  toast.add({
    title: '评分已更改',
    color: 'success',
    description: `您选择的评分是 ${value}`
  })
}

function handleHover(value: number | null) {
  hovering.value = value
}
</script>

<template>
  <div class="space-y-2">
    <MStarRating v-model="rating" @change="handleChange" @hover="handleHover" />

    <div class="text-sm text-gray-500">
      <div>当前评分: {{ rating }}</div>
      <div>悬停星级: {{ hovering ?? '-' }}</div>
    </div>
  </div>
</template>

键盘导航

组件支持完整的键盘交互,提升无障碍访问性:

  • 方向键 增减评分(支持半星步进)
  • 快捷键Home 设置最小评分,End 设置最大评分
  • 数字键0-9 直接跳转到对应评分
  • 清除键Backspace / Delete 清除评分(需启用 clearable
组件遵循 WCAG 无障碍规范,包含完整的 ARIA 属性和键盘焦点管理

禁用状态

通过 disabled 禁用交互:

4/5
<script setup lang="ts">
const rating = ref(4)
</script>

<template>
  <MStarRating v-model="rating" disabled />
</template>

自定义插槽

通过插槽添加前缀、后缀或自定义徽章:

评分:
4/5 分 (128 评价)
<script setup lang="ts">
const rating = ref(4)
</script>

<template>
  <MStarRating v-model="rating">
    <template #prefix>
      <span class="text-sm text-gray-500 mr-2">评分:</span>
    </template>

    <template #badge="{ label }">
      <span class="text-sm text-primary font-semibold ml-2">
        {{ label }} 分
      </span>
    </template>

    <template #suffix>
      <span class="text-xs text-gray-400 ml-2">(128 评价)</span>
    </template>
  </MStarRating>
</template>

API

Props

Prop Default Type
modelValue0 number

当前评分值

max5 number

最大星级数

disabledfalseboolean

是否禁用

readonlyfalseboolean

是否只读

showBadgetrueboolean

是否显示评分徽章

buttonProps Partial<ButtonProps>

自定义星星按钮属性

emptyIcon'i-lucide-star' string

未选中星星的图标

filledIcon'i-lucide-star' string

选中星星的图标

halfIcon'i-lucide-star-half' string

半星图标

color'warning' "error" | "primary" | "secondary" | "success" | "info" | "warning" | "neutral"

选中星星的颜色

size'sm' "xs" | "sm" | "md" | "lg" | "xl"

星星大小

allowHalffalseboolean

是否允许半星

clearablefalseboolean

是否允许清除评分

Emits

Event Type
change[value: number]
update:modelValue[value: number]
hover[value: number | null]

Slots

Slot Type
prefix{ value: number; max: number; }
badge{ value: number; max: number; label: string; }
suffix{ value: number; max: number; }

Changelog

dc8d9 — feat: 集成主题系统到 playground 并优化样式配置

fa2e7 — feat: 为 StarRating 组件添加键盘导航和无障碍支持

5ecc3 — ✨ feat: 添加 StarRating 组件和直接组件示例

Copyright © 2025 - 2026 YiXuan - MIT License