当前位置:首页 > 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>

实现半星评分

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

<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 效果实现方法 Vue.js 提供了多种方式实现动态效果,包括过渡动画、状态驱动的 UI 变化以及第三方动画库集成。以下是常见效果的实现方案: 过渡动画 使用 Vue 内置的 <tran…

vue实现tag效果

vue实现tag效果

实现基本标签结构 使用 Vue 的模板语法创建标签容器和单个标签元素。通过 v-for 动态渲染标签列表,结合 v-bind:key 确保渲染性能。 <template> &l…

vue滑动评分实现

vue滑动评分实现

Vue 滑动评分实现 使用原生 HTML5 range 输入 在 Vue 中可以通过 <input type="range"> 快速实现滑动评分功能。这种方法不需要额外依赖库,适合简单场景…

vue 实现分页效果

vue 实现分页效果

使用 Element UI 实现分页 Element UI 提供了现成的分页组件 el-pagination,适合快速集成到 Vue 项目中。 安装 Element UI: npm insta…

vue 实现toggle效果

vue 实现toggle效果

使用 v-show 实现 Toggle 通过 v-show 指令可以控制元素的显示与隐藏,适合频繁切换的场景。v-show 仅切换 CSS 的 display 属性,不会销毁和重建 DOM。 &l…

vue实现过度效果

vue实现过度效果

Vue 过渡效果实现方法 Vue 提供了内置的 <transition> 和 <transition-group> 组件,用于在元素或组件进入/离开 DOM 时应用过渡效果。…