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初学困境—js初学
Dec 29 Javascript
jquery实现div拖拽宽度示例代码
Jul 31 Javascript
JavaScript?Apple设备检测示例代码
Nov 15 Javascript
jquery实现炫酷的叠加层自动切换特效
Feb 01 Javascript
jQuery javascript获得网页的高度与宽度的实现代码
Apr 26 Javascript
JavaScript实现获取用户单击body中所有A标签内容的方法
Jun 05 Javascript
详解React Native网络请求fetch简单封装
Aug 10 Javascript
微信小程序导航栏跟随滑动效果的实现代码
May 14 Javascript
Vue中fragment.js使用方法小结
Feb 17 Javascript
vue动画—通过钩子函数实现半场动画操作
Aug 09 Javascript
JS 基本概念详细介绍
Oct 16 Javascript
ECharts transform数据转换和dataZoom在项目中使用
Dec 24 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实现的生成静态HTML速度快类库
2007/03/31 PHP
php数组函数序列之array_flip() 将数组键名与值对调
2011/11/07 PHP
PHP 使用redis简单示例分享
2015/03/05 PHP
php实现多城市切换特效
2015/08/09 PHP
PHP PDO操作MySQL基础教程
2017/06/05 PHP
PHP如何获取当前主机、域名、网址、路径、端口等参数
2017/06/09 PHP
PHP中实现中文字串截取无乱码的解决方法
2018/05/29 PHP
用js解决数字不能换行问题
2010/08/10 Javascript
JQuery 1.3.2以上版本中出现pareseerror错误的解决方法
2011/01/11 Javascript
JavaScript实现twitter puddles算法实例
2014/12/06 Javascript
jQuery返回定位插件详解
2017/05/15 jQuery
Vue中插入HTML代码的方法
2018/09/21 Javascript
关于Vue Router中路由守卫的应用及在全局导航守卫中检查元字段的方法
2018/12/09 Javascript
Vue extend的基本用法(实例详解)
2019/12/09 Javascript
如何基于filter实现网站整体变灰功能
2020/04/17 Javascript
vue 使用原生组件上传图片的实例
2020/09/08 Javascript
Python读写Excel文件方法介绍
2014/11/22 Python
python获取指定字符串中重复模式最高的字符串方法
2018/06/29 Python
python实现图片转字符小工具
2019/04/30 Python
python爬取Ajax动态加载网页过程解析
2019/09/05 Python
Python脚本破解压缩文件口令实例教程(zipfile)
2020/06/14 Python
PyTorch 导数应用的使用教程
2020/08/31 Python
Python如何执行系统命令
2020/09/23 Python
filter使用python3代码进行迭代元素的实例详解
2020/12/03 Python
需要知道的CSS3动画技术
2010/01/01 HTML / CSS
naturalizer加拿大官网:美国娜然女鞋
2017/04/04 全球购物
德国古洛迷亚百货官网:GALERIA Kaufhof
2017/06/20 全球购物
生产工厂门卫岗位职责
2014/09/26 职场文书
公安个人四风问题对照检查及整改措施
2014/10/28 职场文书
党员示范岗材料
2014/12/19 职场文书
领导干部失职检讨书
2015/05/05 职场文书
给校长的建议书范文
2015/09/14 职场文书
2016年3月份红领巾广播稿
2015/12/21 职场文书
企业内部管理控制:银行存款控制制度范本
2020/01/10 职场文书
为什么不建议在go项目中使用init()
2021/04/12 Golang
python opencv将多个图放在一个窗口的实例详解
2022/02/28 Python