热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Vue组件star组件设计

Vue自定义




文章目录





    • 一 需求明确

    • 一 问题分析

    • 二. 代码实现

    • 三.调用

    • 总结

    • vue 小总结

    • 参考文档




何时使用
对评价进行展示


一 需求明确

实现一个star组件, 展示5个星,
支持 (全星, 半星, 空星),
支持 大小(24px, 36px, 48px)

一 问题分析

要展示5颗星,v-for

接口定义





















属性默认值备注
size48(备选项,48,36,24)星星的大小 (单位px)
scoreNumber星星个数, 为3.6展示3星半

图片定义

.star24_half
.star36_half
.star48_half

状态定义
.on 全星
.half 半星
.off 0星

二. 代码实现

<div class="star" :class="starType">
<span v-for="(itemClass,index) in itemClasses" :class="itemClass" class="star-item" :key="index">span>
div>

通过监听 starType 的样式, 控制星的大小

props: {

// 1.定义外部传递来的属性
size:{
// 尺寸
type:Number
},
score:{
// 展示得分
type:Number
}
},
starType() {

return 'star-' + this.size;
},

.star
.star-item
&.star-48
&.star-36
&.star-24

<template>
<!-- 定义基础默认的样式,:class= 定义动态附加样式 -->
<div class="star" :class="startType">
<span v-for="(itemClass, index) in itemClasses" :class="itemClass" class="star-item" :key="index"></span>
</div>
</template>
<script type="text/ecmascript-6">
const LENGTH = 5;
const CLS_ON = 'on';
const CLS_HALF = 'half';
const CLS_OFF = 'off';
export default {

props: {

// 1.定义外部传递来的属性
size: {
// 尺寸
type: Number
},
score: {
// 展示得分
type: Number
}
},
data() {

return {

detailShow: false // 默认是不展示
}
},
computed: {

startType() {
// 依赖于 size 属性
return 'star-' + this.size
},
// 3. 利用计算属性, 计算星星个数
itemClasses(){

let result = [] // 构造出 ['on','on','on','half', 'off']这样的数组
// Math.floor(3.6 *2) /2 =3.5
// Math.floor(3.4 *2) /2 =3
// Math.floor(4 *2) /2 =4
// 向下取0.5倍数, 判断是否过半的. 数学方法进行精确
let score = Math.floor(this.score *2) /2
let hasDecimal = score % 1 !==0 // 是否有小数
let integer = Math.floor(score) // 是否有整数
// 1. 构造全星
for (let i = 0; i < integer; i++) {

result.push(CLS_ON)
}
// 2. 添加半星
if (hasDecimal) {

result.push(CLS_HALF)
}
// 3. 补齐空星
while(result.length < LENGTH){

result.push(CLS_OFF)
}
return result
}
}
};
</script>
<style lang="less" scoped>
// mixin 混入
// @import "../../common/stylus/mixins.less";
.bg-image-base(@url: '') {

@2xImgUrl: "@2x.png";
// call mixin .c-icon();
background-image: url("@{url}@{2xImgUrl}");
}
;
@media (-webkit-min-device-pixel-ratio: 2),
(min-device-pixel-ratio: 2) {

.bg-image-base(@url: '') {

@3xImgUrl: "@3x.png";
// call mixin .c-icon();
background-image: url("@{url}@{3xImgUrl}");
}
}
// .bg-image('star24_half','')
// .on 全星
// .half 半星
// .off 0星
// 2. 定义css样式
.star {

font-size: 0;
.star-item {

// 横向排布
display: inline-block;
background-repeat: no-repeat;
}
&.star-48 {

.star-item {

width: 20px;
height: 20px;
margin-right: 22px;
background-size: 20px 20px;
// 设置最后一个元素没有 右侧间距
&:last-child {

margin-right: 0;
}
&.on {

.bg-image-base('star48_on')
}
&.half {

.bg-image-base('star48_half')
}
&.off {

.bg-image-base('star48_off')
}
}
}
&.star-36 {

.star-item {

width: 15px;
height: 15px;
margin-right: 6px;
background-size: 15px 15px;
// 设置最后一个元素没有 右侧间距
&:last-child {

margin-right: 0;
}
&.on {

.bg-image-base('star36_on')
}
&.half {

.bg-image-base('star36_half')
}
&.off {

.bg-image-base('star36_off')
}
}
}
&.star-24 {

.star-item {

width: 10px;
height: 10px;
margin-right: 3px;
background-size: 10px 10px;
// 设置最后一个元素没有 右侧间距
&:last-child {

margin-right: 0;
}
&.on {

.bg-image-base('star24_on')
}
&.half {

.bg-image-base('star24_half')
}
&.off {

.bg-image-base('star24_off')
}
}
}
}
</style>

三.调用






  1. 注册组件

export default {
...
props: {
},
components: {
'v-star': Star
},
data() {
return {
}
},
created() {// 转换为对应的样式
},
methods: {
}
}


  1. 引用组件



总结

这里的核心思路在于, 通过运用计算属性computed,


  1. 利用父级传来的score, 计算出 列表 itemClasses, 补足星数


  2. 利用父级传来的size, 同步 startType(), 方法, 与 ‘star-’(star-48, star-36, star-24), 样式属性进行配合, 决定了星星的大小


  3. .start-item,样式, 与具体的 ‘star-’(star-48, &.on/ &.off) ,样式追加, 先行设计盒子的宽度, 后置入对应的图片, 进行展示


  4. 使用mixins, 方法, 简化了代码编写的思路



vue 小总结

vue 中, 属性值如果需要用数字 , 需要使用v-bind (简写为: )绑定属性值,
ps: 否则, 将被解析为string字符串,
如下:



参考文档

https://ant.design/components/rate-cn/

https://element.eleme.cn/#/zh-CN/component/rate

https://github.com/ElemeFE/element/blob/dev/packages/rate/src/main.vue


推荐阅读
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
author-avatar
用户76rmcbq626
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有