当前位置:首页 > VUE

vue实现评分效果

2026-02-20 07:24:03VUE

Vue 实现评分效果的方法

在 Vue 中实现评分效果可以通过多种方式完成,常见的有基于组件库或自定义实现。以下是几种常见的方法:

使用第三方组件库(如 Element UI)

Element UI 提供了现成的评分组件,可以快速实现评分功能。

安装 Element UI:

npm install element-ui

在 Vue 项目中引入并使用:

<template>
  <el-rate v-model="rating" :colors="colors" :max="5"></el-rate>
</template>

<script>
export default {
  data() {
    return {
      rating: 3,
      colors: ['#99A9BF', '#F7BA2A', '#FF9900']
    };
  }
};
</script>

自定义评分组件

如果需要完全自定义评分效果,可以通过 Vue 实现一个简单的评分组件。

<template>
  <div class="star-rating">
    <span 
      v-for="star in maxStars" 
      :key="star" 
      @click="setRating(star)"
      @mouseover="hoverRating(star)"
      @mouseleave="resetRating"
      :class="{ 'active': star <= currentRating }"
    >
      ★
    </span>
  </div>
</template>

<script>
export default {
  props: {
    maxStars: {
      type: Number,
      default: 5
    },
    initialRating: {
      type: Number,
      default: 0
    }
  },
  data() {
    return {
      currentRating: this.initialRating,
      hoverRating: 0
    };
  },
  methods: {
    setRating(star) {
      this.currentRating = star;
      this.$emit('rating-selected', star);
    },
    hoverRating(star) {
      this.hoverRating = star;
    },
    resetRating() {
      this.hoverRating = 0;
    }
  }
};
</script>

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

使用 SVG 实现更灵活的评分

如果需要更灵活的样式(如半星评分),可以通过 SVG 实现。

<template>
  <div class="star-rating">
    <svg 
      v-for="star in maxStars" 
      :key="star" 
      @click="setRating(star)"
      @mouseover="hoverRating(star)"
      @mouseleave="resetRating"
      :width="starSize" 
      :height="starSize" 
      :viewBox="`0 0 ${starSize} ${starSize}`"
    >
      <polygon 
        :points="getStarPoints(starSize/2, starSize/2, starSize/2, 5)"
        :fill="star <= currentRating ? 'gold' : '#ccc'"
      />
    </svg>
  </div>
</template>

<script>
export default {
  props: {
    maxStars: {
      type: Number,
      default: 5
    },
    initialRating: {
      type: Number,
      default: 0
    },
    starSize: {
      type: Number,
      default: 24
    }
  },
  data() {
    return {
      currentRating: this.initialRating,
      hoverRating: 0
    };
  },
  methods: {
    getStarPoints(cx, cy, r, points) {
      const angle = Math.PI / points;
      let coords = '';
      for (let i = 0; i < 2 * points; i++) {
        const currAngle = i * angle - Math.PI / 2;
        const r2 = i % 2 === 0 ? r : r / 2;
        coords += (cx + r2 * Math.cos(currAngle)) + ',' + (cy + r2 * Math.sin(currAngle)) + ' ';
      }
      return coords.trim();
    },
    setRating(star) {
      this.currentRating = star;
      this.$emit('rating-selected', star);
    },
    hoverRating(star) {
      this.hoverRating = star;
    },
    resetRating() {
      this.hoverRating = 0;
    }
  }
};
</script>

实现半星评分

如果需要支持半星评分,可以通过计算鼠标位置实现更精细的评分。

vue实现评分效果

<template>
  <div class="star-rating" @mouseleave="resetRating">
    <div 
      v-for="star in maxStars" 
      :key="star" 
      class="star-container"
      @mousemove="updatePartialRating(star, $event)"
      @click="setRating(partialRating)"
    >
      <div class="star-background">★</div>
      <div 
        class="star-foreground" 
        :style="{ width: `${getPartialWidth(star)}%` }"
      >★</div>
    </div>
  </div>
</template>

<script>
export default {
  props: {
    maxStars: {
      type: Number,
      default: 5
    },
    initialRating: {
      type: Number,
      default: 0
    }
  },
  data() {
    return {
      currentRating: this.initialRating,
      partialRating: 0,
      hoverRating: 0
    };
  },
  methods: {
    updatePartialRating(star, event) {
      const rect = event.target.getBoundingClientRect();
      const percentage = (event.clientX - rect.left) / rect.width;
      this.partialRating = star - 1 + percentage;
    },
    setRating(rating) {
      this.currentRating = rating;
      this.$emit('rating-selected', rating);
    },
    resetRating() {
      this.partialRating = this.currentRating;
    },
    getPartialWidth(star) {
      if (this.partialRating >= star) return 100;
      if (this.partialRating >= star - 1) return (this.partialRating - (star - 1)) * 100;
      return 0;
    }
  }
};
</script>

<style>
.star-rating {
  display: flex;
}
.star-container {
  position: relative;
  font-size: 24px;
  cursor: pointer;
}
.star-background {
  color: #ccc;
}
.star-foreground {
  position: absolute;
  top: 0;
  left: 0;
  color: gold;
  overflow: hidden;
  white-space: nowrap;
}
</style>

以上方法可以根据需求选择,从简单的组件库集成到完全自定义的实现都能满足不同场景的需求。

标签: 评分效果
分享给朋友:

相关文章

vue实现突出效果

vue实现突出效果

Vue 实现突出效果的方法 在 Vue 中实现突出效果通常涉及动态样式绑定、动画过渡或第三方库的使用。以下是几种常见实现方式: 动态类名绑定 通过 v-bind:class 或简写 :class 实…

vue实现tab效果

vue实现tab效果

Vue 实现 Tab 效果的方法 使用动态组件和 v-if 通过 v-if 或 v-show 控制不同标签内容的显示与隐藏,结合点击事件切换当前激活的标签页。 <template>…

vue实现taggle效果

vue实现taggle效果

Vue实现Toggle效果 在Vue中实现Toggle效果可以通过多种方式完成,以下是几种常见的方法: 方法1:使用v-model和v-show/v-if 通过v-model绑定一个布尔值,结合v…

vue实现弹幕效果

vue实现弹幕效果

实现弹幕效果的基本思路 在Vue中实现弹幕效果,通常需要结合CSS动画和动态数据渲染。弹幕的核心是让文字从右向左平滑移动,同时支持多行显示和碰撞检测。 使用CSS动画实现移动效果 通过CSS的@ke…

vue实现水印效果

vue实现水印效果

实现水印效果的几种方法 在Vue中实现水印效果可以通过多种方式,以下是几种常见的方法: 使用CSS背景图 通过CSS的background-image属性可以实现简单的水印效果。定义一个包含水印文本…

vue实现数字翻页效果

vue实现数字翻页效果

Vue 实现数字翻页效果 在 Vue 中实现数字翻页效果可以通过多种方式完成,以下是一种常见的实现方法: 使用 transition 和动态绑定 通过 Vue 的 transition 组件和动态绑…