首页 > 编程 > JavaScript > 正文

js评分组件使用详解

2019-11-19 16:25:07
字体:
来源:转载
供稿:网友

我们知道,许多外卖app都有评分的星星,这里我总结一下对评分组件的开发,学习视频:饿了么实战(慕课网)

1.html部分

<div class="star" :class="starType">    <span v-for="itemClass in itemClasses" :class="itemClass" class="star-item" track-by="$index"></span></div>

解释

1.在大的div里绑定starType是因为在整个App中,有多个评分组件,而它们的大小不一样,所以根据大小动态的绑定class.

同样的原理,在上一节header组件开发中也有介绍,但直到写到这里我开始渐渐明白vue.js中:class的意义。以前我想既然可以直接添加class,为什么要用绑定class来多此一举。现在我明白的,基础的样式设定,直接添加class就可以了,但是有时候涉及到根据不同的状态有不同的样式时,就要用绑定class了。

2.v-for 这里我们没有写5个span,而是遍历itemClasses,这是vue.js中的一种常用方法。既减少了代码,而且动态获取数据。

2.js部分

1. 得到评分数据

像上一节一样,我们通过props来接收数据。我们要接收的是两个number类型的数据,一个是星星的尺寸,一个是分数。

props: {      size:{        type:Number      },      score:{        type:Number      }    }

2.属性的计算

1).接收size动态绑定不同的class

starType() {        return 'star-'+this.size;      }  .star-48 {    width: 20px;    height: 20px;    margin-right: 22px;    background-size: 20px 20px;      }  .star-36 {    width: 15px;    height: 15px;    margin-right: 6px;    background-size: 15px 15px;  }  .star-24 {    width: 10px;    height: 10px;    margin-right: 3px;    background-size: 10px 10px;  }

2). 通过计算确定添加全星半星和无星

const LENGTH = 5;const CLS_ON = 'on';const CLS_HALF = 'half';const CLS_OFF = 'off';itemClasses() {        let result = [];        let score = Math.floor(this.score*2)/2;        let hasDecimal = score%1 !== 0;        let integer = Math.floor(score);        for (var i = 0; i < integer; i++) {          result.push(CLS_ON);        }        if(hasDecimal) {          result.push(CLS_HALF);        }        while (result.length<LENGTH) {          result.push(CLS_OFF);        }        return result;      }

这段代码的思路是:创建一个数组储存星星,判断分数是否在.5以上,将分数取整,有多少分push几个on星星进去,有.5以上,push一个half,然后push进off直到长度达到5。

3).css部分
以star-48的尺寸为例

.star-48 .on {    background-image: url('star48_on@2x.png')  }  .star-48 .half {    background-image: url('star48_half@2x.png')  }  .star-48 .off {    background-image: url('star48_off@2x.png')  }

4.完整代码

<template> <div class="star" :class="starType">  <span v-for="itemClass in itemClasses" :class="itemClass" class="star-item" track-by="$index"></span> </div></template><script type="text/javascript"> const LENGTH = 5; const CLS_ON = 'on'; const CLS_HALF = 'half'; const CLS_OFF = 'off'; export default {  props: {   size:{    type:Number   },   score:{    type:Number   }  },  computed:{   starType() {    return 'star-'+this.size;   },   itemClasses() {    let result = [];    let score = Math.floor(this.score*2)/2;    let hasDecimal = score%1 !== 0;    let integer = Math.floor(score);    for (var i = 0; i < integer; i++) {     result.push(CLS_ON);    }    if(hasDecimal) {     result.push(CLS_HALF);    }    while (result.length<LENGTH) {     result.push(CLS_OFF);    }    return result;   }  } };</script><style type="text/css"> .star {  font-size: 0; } /* .star-48 {  width: 20px;  height: 20px;  margin-right: 22px;  background-size: 20px 20px;   } */ .star-48 : last-chlid {  margin-right: 0; } .star-48 .on {  background-image: url('star48_on@2x.png') } .star-48 .half {  background-image: url('star48_half@2x.png') } .star-48 .off {  background-image: url('star48_off@2x.png') } .star-36 {  width: 15px;  height: 15px;  margin-right: 6px;  background-size: 15px 15px; } .star-36 .no {  background-image: url('star36_on@2x.png') } .star-36 .half {  background-image: url('star36_half@2x.png') } .star-36 .off {  background-image: url('star36_off@2x.png') } .star-24 {  width: 10px;  height: 10px;  margin-right: 3px;  background-size: 10px 10px; } .star-24 .no {  background-image: url('star24_on@2x.png') } .star-24 .half {  background-image: url('star24_half@2x.png') } .star-24 .off {  background-image: url('star24_off@2x.png') } .star-item {  display: inline-block;  background-repeat: no-repeat;  width: 20px;  height: 20px;  margin-right: 22px;  background-size: 20px 20px; }</style>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表