评分组件开发

我们知道,许多外卖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 {
        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>

转载于:https://www.cnblogs.com/huyuzhu/p/6949766.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
uni-app组件开发是一种基于Vue框架的跨平台开发方式,可以同时开发出适用于多个平台的应用程序。在uni-app中,组件的使用方式包括导入组件、注册组件和使用组件。首先,需要导入组件,可以使用import语句将组件引入到当前页面或组件中。然后,在components选项中注册组件,以便在模板中使用。最后,在模板中使用组件,并通过传来配置组件的属性。例如,可以使用uni-rate组件来实现评分功能,通过设置value属性来指定点亮的星星数量。\[3\] 在组件开发过程中,需要注意一些性能方面的问题。在使用组件时,需要一直监听组件方法,建议及时销毁监听,以节省性能消耗。此外,需要注意组件的生命周期,组件的DOM元素只有在调用组件时才会完成页面的创建。对于性能影响方面,目前暂未发现明显的影响点,除了需要监听通信方法外。\[1\] 如果需要开发uni-app原生插件(native plugin),可以参考相关的开发指南和参考文档。在开发过程中,需要注意压缩包的格式要求,根目录需为插件id目录,二级目录是ios、android子目录及package.json。同时,还需要参考Android和iOS的开发文档进行相关开发工作。\[2\] #### 引用[.reference_title] - *1* [uniapp 组件开发基础方案](https://blog.csdn.net/qq_36869100/article/details/116092589)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v12^insert_chatgpt"}} ] [.reference_item] - *2* [uni-app插件开发指南汇总](https://blog.csdn.net/superlover_/article/details/89296311)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v12^insert_chatgpt"}} ] [.reference_item] - *3* [uni-app开发篇之组件使用相关](https://blog.csdn.net/qq_19924321/article/details/107224243)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v12^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值