js评分组件使用详解


Posted in Javascript onJune 06, 2017

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

js评分组件使用详解

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>

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

Javascript 相关文章推荐
JS、DOM和JQuery之间的关系示例分析
Apr 09 Javascript
JavaScript实现的一个计算数字步数的算法分享
Dec 06 Javascript
实现音乐播放器的代码(html5+css3+jquery)
Aug 04 Javascript
实例详解JSON数据格式及json格式数据域字符串相互转换
Jan 07 Javascript
轻松实现js图片预览功能
Jan 18 Javascript
JQuery ztree 异步加载实例讲解
Feb 25 Javascript
javascript冒泡排序小结
Apr 10 Javascript
jquery实现网站列表切换效果的2种方法
Aug 12 Javascript
原生js FileReader对象实现图片上传本地预览效果
Mar 27 Javascript
Vuex实现简单购物车
Jan 10 Vue.js
微信小程序 接入腾讯地图的两种写法
Jan 12 Javascript
详解 TypeScript 枚举类型
Nov 02 Javascript
javascript中mouseenter与mouseover的异同
Jun 06 #Javascript
jquery仿京东商品放大浏览页面
Jun 06 #jQuery
Node.js连接mongodb实例代码
Jun 06 #Javascript
jquery实现图片放大点击切换
Jun 06 #jQuery
AngularJS 验证码60秒倒计时功能的实现
Jun 05 #Javascript
AngularJS 支付倒计时功能实现思路
Jun 05 #Javascript
解决bootstrap中使用modal加载kindeditor时弹出层文本框不能输入的问题
Jun 05 #Javascript
You might like
异步加载技术实现当滚动条到最底部的瀑布流效果
2014/09/16 PHP
PHP生成可点击刷新的验证码简单示例
2016/05/13 PHP
php微信开发之自定义菜单实现
2016/11/18 PHP
[原创]php实现数组按拼音顺序排序的方法
2017/05/03 PHP
Jquery Ajax学习实例3 向WebService发出请求,调用方法返回数据
2010/03/16 Javascript
js下利用控制器载入对应脚本
2010/07/17 Javascript
JavaScript去掉空格的方法集合
2010/12/28 Javascript
node.js中的fs.lstatSync方法使用说明
2014/12/16 Javascript
跟我学习javascript的prototype使用注意事项
2015/11/17 Javascript
JavaScript从数组的indexOf()深入之Object的Property机制
2016/05/11 Javascript
原生js开发的日历插件
2017/02/04 Javascript
详解在Vue中有条件地使用CSS类
2017/09/30 Javascript
vue组件间通信子与父详解(二)
2017/11/07 Javascript
vue引入新版 vue-awesome-swiper插件填坑问题
2018/01/25 Javascript
angular动态表单制作
2018/02/23 Javascript
Bootstrap Paginator+PageHelper实现分页效果
2018/12/29 Javascript
react的滑动图片验证码组件的示例代码
2019/02/27 Javascript
[02:51]DOTA2 2015国际邀请赛中国区预选赛第一日战报
2015/05/27 DOTA
[03:27]《辉夜杯》线下训练营 导师CU和海涛指点迷津
2015/10/23 DOTA
利用Python画ROC曲线和AUC值计算
2016/09/19 Python
python学习教程之Numpy和Pandas的使用
2017/09/11 Python
用python制作游戏外挂
2018/01/04 Python
pandas string转dataframe的方法
2018/04/11 Python
使用Python调取任意数字资产钱包余额功能
2019/08/15 Python
HTML5拖放API实现自动生成相框功能
2020/04/07 HTML / CSS
英国最大的宝石首饰超市:QP Jewellers
2018/09/23 全球购物
德国户外装备、登山运动和攀岩商店:tapir store
2020/02/12 全球购物
Clos19英国:高档香槟、葡萄酒和烈酒在线购物平台
2020/07/10 全球购物
用JAVA实现一种排序,JAVA类实现序列化的方法(二种)
2014/04/23 面试题
法警的竞聘演讲稿
2014/01/02 职场文书
本科毕业生应聘求职信
2014/07/06 职场文书
法人单位适用的授权委托书
2014/09/19 职场文书
民警群众路线教育实践活动对照检查材料
2014/10/04 职场文书
2016年“我们的节日·重阳节”主题活动总结
2016/04/01 职场文书
浅谈python数据类型及其操作
2021/05/25 Python
Windows server 2012搭建FTP服务器
2022/04/29 Servers