这里有新鲜出炉的Javascript教程,程序狗速度看过来!
Javascript 是一种由Netscape的LiveScript发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
这篇文章主要为大家介绍了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>
来源: http://www.phperz.com/article/17/0903/338835.html