[关闭]
@15013890200 2018-08-13T16:06:40.000000Z 字数 2627 阅读 904

vue score 评分插件

vue javascript 插件


1 插件部分

1.1 template部分

  1. <template>
  2. <div>
  3. <div class="j_div_score">
  4. <div class="j_div_gray" :style="{cursor:disable ? '':'pointer'}">
  5. <span v-for="i in arr" @click="setScore(i)" class="j_score_gray"></span>
  6. <span class="j_sp_score" v-if="gold_width > 0">{{score}} 分</span>
  7. </div>
  8. <div class="j_div_gold" :style="{width:gold_width+'px'}">
  9. <span :style="{cursor:disable ? '':'pointer'}" v-for="a in arr" @click="setScore(a)" class="j_score_gold"></span>
  10. </div>
  11. </div>
  12. </div>
  13. </template>

1.2 script 部分

  1. <script>
  2. export default {
  3. name: 'myscore',
  4. data(){
  5. return{
  6. total: 5,
  7. arr: null,
  8. gold_width: 0,
  9. zero: false,
  10. score: 2,
  11. disable: false
  12. }
  13. },
  14. props:{
  15. scoreObj: {
  16. type: Object,
  17. default: null
  18. }
  19. },
  20. mounted(){
  21. if(this.arr === null)this.arr = [];
  22. for(let i = 1; i <= this.total; i++){
  23. this.arr.push(i);
  24. }
  25. if(this.score < 0)this.score = 0;
  26. if(this.score > 10)this.score = 10;
  27. this.gold_width = 22 * (this.score/2) + Math.floor(this.score/2)*5;
  28. },
  29. methods: {
  30. setScore: function(i){
  31. if(this.disable) return;
  32. if(this.gold_width == 27 && i == 1 && this.zero){
  33. this.gold_width = 0;
  34. this.score = 0;
  35. }
  36. else{
  37. this.gold_width = 27*i;
  38. this.score = i * 2;
  39. }
  40. }
  41. },
  42. beforeMount(){
  43. if(this.scoreObj){
  44. for(let key in this.scoreObj){
  45. this.$data[key] = this.scoreObj[key];
  46. }
  47. }
  48. },
  49. watch: {
  50. 'score': function(){
  51. this.$emit('callback',this.score);
  52. }
  53. }
  54. }
  55. </script>

1.3 css部分

  1. <style scoped>
  2. .j_div_score{font-size: 14px;font-family: '微软雅黑';position:relative;user-select:none;}
  3. .j_score_gray{background:url(imgs/gray.png) no-repeat;display: inline-block;width: 22px;height: 20px;margin-right:5px;}
  4. .j_score_gold{background:url(imgs/gold.png) no-repeat;display: inline-block;width: 22px;height: 20px;margin-right:5px;}
  5. .j_div_gray,.j_div_gold{float:left;position:absolute;top:0;left:0;height:20px;white-space:nowrap;}
  6. .j_div_gold{overflow:hidden;transition:width 0.5s;}
  7. .j_sp_score{display:inline-block;height:20px;line-height:20px;position:relative;top:-4px;color:#666;margin-left:10px;}
  8. </style>

Tips:

1、以上通常会被放在一个.vue文件里面
2、css部分引入的图片需要根据实际情况引入

2 插件注册以及引用

2.1 注册

  1. import Vue from 'vue'
  2. import vScore from './score.vue'
  3. const score = {
  4. name: 'myscore',
  5. install: function(){
  6. Vue.component('my-score',vScore);
  7. }
  8. };
  9. export default score;

Tips:

1、import路径根据实际项目情况而定,下同(不再赘述)
2、组件注册名 my-score 可随意起,最好不要与HTML保留标签冲突

2.2 引用

  1. import vScore from '../components//vScore/score.js'
  2. Vue.use(vScore)
  1. <template>
  2. <div>
  3. <div class="div_score">
  4. <my-score :scoreObj="scoreObj" @callback="getScore"></my-score>
  5. </div>
  6. </div>
  7. </template>
  8. <script>
  9. import Vue from 'vue'
  10. export default{
  11. data(){
  12. return{
  13. scoreObj: {
  14. score: 5.7,
  15. disable: false,
  16. zero: true
  17. }
  18. }
  19. },
  20. methods: {
  21. getScore: function(s){
  22. console.log(s);
  23. }
  24. }
  25. }
  26. </script>

3 插件可配置选择

3.1 2.2 插件引用部分scoreObj包含三个属性:

属性名称含义默认值是否必须
score初始化评分插件0
disable是否禁用true
zero是否可以选择0分true

Tips:

评分一般都是两分一跳,总分10分,考虑实际情况和美观,暂不开放对星星数量和每颗星对应的分值进行配置

3.2 回调函数部分

一般评分插件是需要回调一个分数,这样可以在@callback处定义自己的回调方法


4 实际效果

实际效果

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注