当前位置:首页 > VUE

vue实现星星

2026-03-27 07:21:35VUE

使用Vue实现星星评分组件

方法一:基础实现

创建Vue组件,使用v-for循环生成星星图标,通过点击事件切换选中状态

<template>
  <div class="star-rating">
    <span 
      v-for="(star, index) in stars" 
      :key="index"
      @click="rate(index)"
      :class="{ 'active': index < currentRating }"
    >
      ★
    </span>
  </div>
</template>

<script>
export default {
  data() {
    return {
      stars: Array(5).fill('★'),
      currentRating: 0
    }
  },
  methods: {
    rate(index) {
      this.currentRating = index + 1
    }
  }
}
</script>

<style>
.star-rating span {
  font-size: 2rem;
  color: #ccc;
  cursor: pointer;
}
.star-rating span.active {
  color: gold;
}
</style>

方法二:支持半星评分

通过计算属性处理半星显示逻辑,使用CSS实现半星效果

<template>
  <div class="star-rating">
    <span 
      v-for="(star, index) in stars" 
      :key="index"
      @mouseover="hoverRating = index + 1"
      @mouseleave="hoverRating = 0"
      @click="setRating(index + 1)"
    >
      <span class="star-background">★</span>
      <span 
        class="star-foreground" 
        :style="{ width: getStarWidth(index) }"
      >★</span>
    </span>
  </div>
</template>

<script>
export default {
  props: {
    value: Number,
    maxStars: {
      type: Number,
      default: 5
    }
  },
  data() {
    return {
      hoverRating: 0,
      stars: Array(this.maxStars).fill('★')
    }
  },
  computed: {
    currentRating() {
      return this.hoverRating || this.value
    }
  },
  methods: {
    setRating(rating) {
      this.$emit('input', rating)
    },
    getStarWidth(index) {
      const rating = this.currentRating
      if (rating >= index + 1) return '100%'
      if (rating > index) return `${(rating - index) * 100}%`
      return '0%'
    }
  }
}
</style>

方法三:使用第三方图标库

结合Font Awesome等图标库实现更精美的星星效果

<template>
  <div class="star-rating">
    <i 
      v-for="index in maxStars"
      :key="index"
      :class="[
        'fas',
        index <= currentRating ? 'fa-star' : 'fa-star-o'
      ]"
      @click="setRating(index)"
      @mouseover="hoverRating = index"
      @mouseleave="hoverRating = 0"
    ></i>
  </div>
</template>

<script>
export default {
  props: {
    value: Number,
    maxStars: {
      type: Number,
      default: 5
    }
  },
  data() {
    return {
      hoverRating: 0
    }
  },
  computed: {
    currentRating() {
      return this.hoverRating || this.value
    }
  },
  methods: {
    setRating(rating) {
      this.$emit('input', rating)
    }
  }
}
</script>

注意事项

vue实现星星

  1. 组件应支持双向绑定,使用v-model指令
  2. 可通过props自定义星星数量、大小和颜色
  3. 添加适当的过渡效果提升用户体验
  4. 考虑添加disabled状态防止误操作
  5. 对于移动端设备,需要添加触摸事件支持

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

相关文章

vue实现主页

vue实现主页

Vue 实现主页的基本步骤 创建一个 Vue 主页通常涉及以下几个关键步骤,从项目初始化到页面布局和功能实现。 初始化 Vue 项目 使用 Vue CLI 或 Vite 初始化项目。Vue CLI…

vue实现波形

vue实现波形

实现波形效果的方法 在Vue中实现波形效果可以通过多种方式完成,常见的方法包括使用Canvas绘制、CSS动画或第三方库。以下是几种实现方案: 使用Canvas绘制波形 通过Canvas API动态…

vue diff实现

vue diff实现

Vue Diff 算法实现原理 Vue 的虚拟 DOM Diff 算法(即 patch 过程)是其高效渲染的核心,主要通过对比新旧虚拟节点的差异,最小化 DOM 操作。以下是关键实现要点: 同层级比…

vue翻页实现

vue翻页实现

Vue翻页实现方法 基础分页组件实现 使用v-for和计算属性实现基础分页逻辑: <template> <div> <ul> <li…

vue实现 hover

vue实现 hover

实现 Vue 中的 hover 效果 在 Vue 中实现 hover 效果可以通过多种方式完成,以下是常见的几种方法: 使用 CSS 伪类 最简单的方式是直接使用 CSS 的 :hover 伪类,无…

vue实现uuid

vue实现uuid

使用 uuid 库生成 UUID 在 Vue 项目中,可以使用 uuid 库来生成 UUID。安装依赖: npm install uuid 在 Vue 组件中使用: import { v4 as…