• 评分组件开发


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

    image.png

    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了。

    1. 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 {
    		 20px;
    		height: 20px;
    		margin-right: 22px;
    		background-size: 20px 20px;
    		
    	}
    	.star-36 {
    		 15px;
    		height: 15px;
    		margin-right: 6px;
    		background-size: 15px 15px;
    	}
    	.star-24 {
    		 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 {
    		 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 {
    		 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 {
    		 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;
    		 20px;
    		height: 20px;
    		margin-right: 22px;
    		background-size: 20px 20px;
    
    	}
    </style>
    
  • 相关阅读:
    员工管理,这么做就对了
    学会自我管理的好处及自我管理包括的内容
    职场人必看的5本书推荐,首推《情商必读12篇》
    企业管理方面的经典著作推荐
    这6本精心挑选的团队管理类好书助你做好团队管理
    战略规划,你的企业真的做对了吗?
    如何提高说服力?说服的技巧有哪些?这本书能给你答案
    读书使人进步,这本营销书籍让你真正读懂市场营销
    P1228 地毯填补问题题解
    P1010 幂次方题解
  • 原文地址:https://www.cnblogs.com/huyuzhu/p/6949766.html
Copyright © 2020-2023  润新知