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 相关文章推荐
javascript中的array数组使用技巧
Jan 31 Javascript
jQuery.Validate 使用笔记(jQuery Validation范例 )
Jun 25 Javascript
表头固定(利用jquery实现原理介绍)
Nov 08 Javascript
JavaScript 对任意元素,自定义右键菜单的实现方法
May 08 Javascript
javascript数组排序汇总
Jul 07 Javascript
每天一篇javascript学习小结(属性定义方法)
Nov 19 Javascript
微信小程序开发之相册选择和拍照详解及实例代码
Feb 22 Javascript
JavaScript体验异步更好的解决办法
Jan 08 Javascript
前后端如何实现登录token拦截校验详解
Sep 03 Javascript
qrcode生成二维码微信长按无法识别问题的解决
Apr 04 Javascript
vue-cli随机生成port源码的方法
Sep 02 Javascript
JSON获取属性值方法代码实例
Jun 30 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
深入解析PHP中foreach语句控制数组循环的用法
2015/11/30 PHP
PHP使用星号隐藏用户名,手机和邮箱的实现方法
2016/09/22 PHP
Laravel日志用法详解
2016/10/09 PHP
屏蔽Flash右键信息的js代码
2010/01/17 Javascript
javascript+xml实现简单图片轮换(只支持IE)
2012/12/23 Javascript
jQuery实现HTML5 placeholder效果实例
2014/12/09 Javascript
iscroll碰到Select无法选择下拉刷新的解决办法
2016/05/21 Javascript
Vue中定义全局变量与常量的各种方式详解
2017/08/23 Javascript
express默认日志组件morgan的方法
2018/04/05 Javascript
图解javascript作用域链
2019/05/27 Javascript
layui表格分页 记录勾选的实例
2019/09/02 Javascript
利用d3.js实现蜂巢图表带动画效果
2019/09/03 Javascript
通过原生vue添加滚动加载更多功能
2019/11/21 Javascript
[00:15]天涯墨客终极技能展示
2018/08/25 DOTA
Python实现数通设备端口使用情况监控实例
2015/07/15 Python
Python读取YUV文件,并显示的方法
2018/12/04 Python
Python中xml和json格式相互转换操作示例
2018/12/05 Python
Python学习笔记之While循环用法分析
2019/08/14 Python
借助Paramiko通过Python实现linux远程登陆及sftp的操作
2020/03/16 Python
python如何求圆的面积
2020/07/01 Python
python 实现客户端与服务端的通信
2020/12/23 Python
详解css3 flex弹性盒自动铺满写法
2020/09/17 HTML / CSS
香港交友网站:be2香港
2018/07/22 全球购物
初中高效课堂实施方案
2014/02/26 职场文书
三年级学生评语
2014/04/23 职场文书
2014年秋季开学典礼主持词
2014/08/02 职场文书
2014党员学习《反腐倡廉警示教育读本》思想汇报
2014/09/13 职场文书
机关干部三严三实心得体会
2014/10/13 职场文书
四风问题专项整治工作情况报告
2014/10/28 职场文书
2014年团总支工作总结
2014/11/21 职场文书
公务员考察材料
2014/12/23 职场文书
MySQL入门命令之函数-单行函数-流程控制函数
2021/04/05 MySQL
HTML5 语义化标签(移动端必备)
2021/08/23 HTML / CSS
SpringBoot实现quartz定时任务可视化管理功能
2021/08/30 Java/Android
再谈python_tkinter弹出对话框创建
2022/03/20 Python
Golang使用Panic与Recover进行错误捕获
2022/03/22 Golang