我们知道,许多外卖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>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍Android评分RationBar控件使用详解,包括了Android评分RationBar控件使用详解的使用技巧和注意事项,需要的朋友参考一下 Android评分RationBar控件,供大家参考,具体内容如下 主要是不想用太多三方的控件,所以决定尽可能自己写,最近有写一个评分的页面,废话不多说直接上图 我觉得嘛 这个东西用ViewGroup包起来感觉会写很多View 于是我决定使
本文向大家介绍js多功能分页组件layPage使用方法详解,包括了js多功能分页组件layPage使用方法详解的使用技巧和注意事项,需要的朋友参考一下 本文的主要目的就是为大家分享layPage 多功能的js分页组件具体操作方法,供大家参考,具体内容如下 php 部分 js 中 laypage(新版本) 跳转分页 js 中 laypage(新版本) ajax 分页 以上就是本文的全部内容,希望对大
本文向大家介绍Android星级评分条控件RatingBar使用详解,包括了Android星级评分条控件RatingBar使用详解的使用技巧和注意事项,需要的朋友参考一下 Android开发中,时不时的就有要实现星星的评分效果,比如某宝,某团,相信大家也都见过,当然了我们可以自己去画,也可以用美工给切的图去实现,其实在Android原生的控件中就可以来实现这样的效果,它就是RatingBar。 来
本文向大家介绍JS组件Bootstrap Table使用方法详解,包括了JS组件Bootstrap Table使用方法详解的使用技巧和注意事项,需要的朋友参考一下 最近客户提出需求,想将原有的管理系统,做下优化,通过手机也能很好展现,想到2个方案: a方案:保留原有的页面,新设计一套适合手机的页面,当手机访问时,进入m.zhy.com(手机页面),pc设备访问时,进入www.zhy.com(pc页
本文向大家介绍JS组件Bootstrap Select2使用方法详解,包括了JS组件Bootstrap Select2使用方法详解的使用技巧和注意事项,需要的朋友参考一下 在介绍select组件的时候,之前分享过一篇JS组件中bootstrap multiselect两大组件较量的文章,这两个组件的功能确实很强大,本文分享下select组件的一些用法和特性。 一些通用的单选、多选、分组等功能这里就
本文向大家介绍js仿淘宝评价评分功能,包括了js仿淘宝评价评分功能的使用技巧和注意事项,需要的朋友参考一下 效果图: 图(1)初始图 图(2)点击效果 代码如下: 以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持呐喊教程!