全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

js评分组件使用详解

我们知道,许多外卖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>

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


# js  # 评分组件  # vue实现简单的星级评分组件源码  # 微信小程序中的店铺评分组件及vue中用svg实现的评分显示组件  # vue2.0实现前端星星评分功能组件实例代码  # iOS实现支持小数的星星评分组件实例代码  # Android开发之拖动条和评分组件用法分析  # React星星评分组件的实现  # 绑定  # 要用  # 的是  # 这是  # 我想  # 几个  # 都有  # 也有  # 是因为  # 多个  # 遍历  # 这段  # 有多少  # 可以直接  # 为例  # 写到  # 涉及到  # 在上  # 饿了  # 创建一个 


相关文章: C#如何使用XPathNavigator高效查询XML  学校为何禁止电信移动建设网站?  手机网站制作与建设方案,手机网站如何建设?  孙琪峥织梦建站教程如何优化数据库安全?  如何优化Golang Web性能_Golang HTTP服务器性能提升方法  如何在阿里云通过域名搭建网站?  广东专业制作网站有哪些,广东省能源集团有限公司官网?  如何批量查询域名的建站时间记录?  如何在七牛云存储上搭建网站并设置自定义域名?  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  定制建站哪家更专业可靠?推荐榜单揭晓  济南网站建设制作公司,室内设计网站一般都有哪些功能?  微信推文制作网站有哪些,怎么做微信推文,急?  高端建站三要素:定制模板、企业官网与响应式设计优化  大同网页,大同瑞慈医院官网?  如何快速建站并高效导出源代码?  行程制作网站有哪些,第三方机票电子行程单怎么开?  如何通过主机屋免费建站教程十分钟搭建网站?  动图在线制作网站有哪些,滑动动图图集怎么做?  杭州银行网站设计制作流程,杭州银行怎么开通认证方式?  如何通过山东自助建站平台快速注册域名?  单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  小型网站建站如何选择虚拟主机?  韩国服务器如何优化跨境访问实现高效连接?  制作销售网站教学视频,销售网站有哪些?  香港服务器建站指南:免备案优势与SEO优化技巧全解析  nginx修改上传文件大小限制的方法  公司网站制作需要多少钱,找人做公司网站需要多少钱?  简易网站制作视频教程,使用记事本编写一个简单的网页html文件?  教学论文网站制作软件有哪些,写论文用什么软件 ?  金*站制作公司有哪些,金华教育集团官网?  如何快速辨别茅台真假?关键步骤解析  如何在宝塔面板中创建新站点?  建站主机与虚拟主机有何区别?如何选择最优方案?  制作旅游网站html,怎样注册旅游网站?  义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?  如何在阿里云域名上完成建站全流程?  建站之星如何开启自定义404页面避免用户流失?  微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?  如何在Windows 2008云服务器安全搭建网站?  如何快速生成橙子建站落地页链接?  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  开心动漫网站制作软件下载,十分开心动画为何停播?  西安大型网站制作公司,西安招聘网站最好的是哪个?  ,交易猫的商品怎么发布到网站上去?  实现点击下箭头变上箭头来回切换的两种方法【推荐】  企业微网站怎么做,公司网站和公众号有什么区别? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。