Vue3评分(Rate)

发布时间:2026/8/29 13:10:21

Vue3评分(Rate)
可自定义设置以下属性是否允许再次点击后清除allowClear类型boolean默认 true是否允许半选allowHalf类型boolean默认 falsestar 总数count类型number默认 5自定义字符character类型star-outlined | star-filled | heart-outlined | heart-filled | string | slot 默认 star-filled预置四种图标字符大小size类型number单位 px默认 20字符选中颜色color类型string默认 #fadb14字符间距gap类型number单位 px默认 8只读无法进行交互disabled类型boolean默认 false当前数受控值 0,1,2,3...v-model:value类型number默认 0效果如下图在线预览①创建评分组件Rate.vue其中引入使用了以下组件Vue3文字提示Tooltipscript setup langts import { ref, watch } from vue import Tooltip from components/tooltip export interface Props { allowClear?: boolean // 是否允许再次点击后清除 allowHalf?: boolean // 是否允许半选 count?: number // star 总数 character?: star-outlined | star-filled | heart-outlined | heart-filled | string // 字符或图标预置四种图标 string | slot size?: number // 字符大小单位 px color?: string // 字符选中颜色 gap?: number // 字符间距单位 px disabled?: boolean // 只读无法进行交互 tooltips?: string[] // 自定义每项的提示信息 tooltipProps?: object // Tooltip 组件属性配置参考 Tooltip Props value?: number // (v-model) 当前数受控值 0,1,2,3... } const props withDefaults(definePropsProps(), { allowClear: true, allowHalf: false, count: 5, character: star-filled, size: 20, color: #fadb14, gap: 8, disabled: false, tooltips: () [], tooltipProps: () ({}), value: 0 }) const activeValue ref() const hoverValue ref() const tempValue ref() // 清除时保存点击value const emits defineEmits([update:value, change, hoverChange]) watch( () props.value, (to) { activeValue.value to }, { immediate: true } ) watch( activeValue, (to) { hoverValue.value to }, { immediate: true } ) function onClick(value: number): void { tempValue.value null if (value ! activeValue.value) { activeValue.value value emits(change, value) // 选择时的回调 emits(update:value, value) } else { if (props.allowClear) { tempValue.value value activeValue.value 0 emits(change, 0) emits(update:value, 0) } else { // 不允许清除 emits(change, value) // 选择时的回调 } } } function onFirstEnter(value: number): void { hoverValue.value value emits(hoverChange, value) // 鼠标经过时数值变化的回调 } function onSecondEnter(value: number): void { hoverValue.value value emits(hoverChange, value) } function resetTempValue(): void { // 重置点击 value tempValue.value null } function onLeave(): void { hoverValue.value activeValue.value } function onUp(): void { tempValue.value null if (activeValue.value props.count) { activeValue.value props.allowHalf ? 0.5 : 1 emits(change, activeValue.value) emits(update:value, activeValue.value) } } function onDown(): void { tempValue.value null if (activeValue.value 0) { activeValue.value - props.allowHalf ? 0.5 : 1 emits(change, activeValue.value) emits(update:value, activeValue.value) } } /script template div classrate-wrap :class{ rate-disabled: disabled } :style--rate-star-color: ${color}; --rate-star-gap: ${gap}px; --rate-star-size: ${size}px; mouseleaveonLeave template v-forn in count :keyn Tooltip v-bindtooltipProps template v-iftooltips[n - 1] #tooltip slot nametooltip :tooltiptooltips[n - 1] :valuen{{ tooltips[n - 1] }}/slot /template div tabindex0 classrate-star :class{ star-half: allowHalf hoverValue n - 0.5 hoverValue n, star-full: hoverValue n, temp-gray: !allowHalf tempValue n } clickallowHalf ? () false : onClick(n) keydown.prevent.rightonUp keydown.prevent.leftonDown div v-ifallowHalf classstar-first :class{ temp-gray-first: tempValue n - 0.5 } click.stoponClick(n - 0.5) mouseenteronFirstEnter(n - 0.5) mouseleaveresetTempValue slot namecharacter :valuen svg v-ifcharacter star-filled classicon-character focusablefalse >script setup langts import Rate from ./Rate.vue import { ref, watchEffect, reactive } from vue import { ThunderboltFilled, LikeFilled, FireFilled } from ant-design/icons-vue const value ref(3) const tooltipsChinese [极差, 失望, 一般, 满意, 惊喜] const tooltipsEnglish [terrible, bad, normal, good, wonderful] const characterOptions [ { label: star-outlined, value: star-outlined }, { label: star-filled, value: star-filled }, { label: heart-outlined, value: heart-outlined }, { label: heart-filled, value: heart-filled }, { label: custom-character, value: custom-character } ] const state reactive({ allowClear: true, allowHalf: true, count: 5, character: star-filled, customCharacter: S, size: 36, color: #fadb14, gap: 8, disabled: false }) watchEffect(() { console.log(value, value.value) }) function onChange(value: number) { console.log(change, value) } function onHoverChange(value: number) { console.log(hover change, value) } /script template div h1{ { $route.name }} { { $route.meta.title }}/h1 h2 classmt30 mb10基本使用/h2 Rate v-model:valuevalue changeonChange hoverChangeonHoverChange / h2 classmt30 mb10文案提示/h2 Space vertical Space aligncenter Rate v-model:valuevalue :tooltipstooltipsChinese / Tag colorblue :borderedfalse { { tooltipsChinese[value - 1] }} /Tag /Space Space aligncenter Rate v-model:valuevalue :tooltipstooltipsEnglish :tooltip-props{ bgColor: #fff, tooltipStyle: { fontWeight: 500, color: rgba(0, 0, 0, 0.88) } } / Tag colorred :borderedfalse { { tooltipsEnglish[value - 1] }} /Tag /Space /Space h2 classmt30 mb10禁用/h2 Rate v-model:valuevalue disabled / h2 classmt30 mb10预置图标/h2 Space vertical Rate v-model:valuevalue characterstar-outlined :size24 / Rate v-model:valuevalue characterheart-filled :size24 / Rate v-model:valuevalue characterheart-outlined :size24 / /Space h2 classmt30 mb10半星/h2 Rate v-model:valuevalue :size24 allow-half / h2 classmt30 mb10自定义字符/h2 Space vertical Rate v-model:valuevalue character好 :size32 allow-half / Rate v-model:valuevalue characterA :size48 allow-half / Rate v-model:valuevalue :size32 allow-half template #character ThunderboltFilled / /template /Rate /Space h2 classmt30 mb10自定义颜色/h2 Space vertical Rate v-model:valuevalue color#1677FF :size32 allow-half / Rate v-model:valuevalue color#ff6900 :size32 allow-half template #character LikeFilled / /template /Rate Rate v-model:valuevalue color#d4380d :size32 allow-half template #character FireFilled / /template /Rate /Space h2 classmt30 mb10自定义间距/h2 Rate v-model:valuevalue :size32 :gap16 / h2 classmt30 mb10自定义 star 总数/h2 Rate v-model:valuevalue :size32 :count10 / h2 classmt30 mb10评分配置器/h2 Row :gutter[24, 12] Col :span6 Space vertical allowClear:Switch v-modelstate.allowClear / /Space /Col Col :span6 Space vertical allowHalf:Switch v-modelstate.allowHalf / /Space /Col Col :span6 Flex gapsmall vertical count:Slider v-model:valuestate.count :min3 :max10 / /Flex /Col Col :span6 Flex gapsmall vertical size:Slider v-model:valuestate.size :min10 :max100 / /Flex /Col Col :span6 Flex gapsmall vertical color:ColorPicker v-model:valuestate.color / /Flex /Col Col :span6 Flex gapsmall vertical gap:Slider v-model:valuestate.gap :min0 :max100 / /Flex /Col Col :span6 Space vertical disabled:Switch v-modelstate.disabled / /Space /Col Col :span6 Flex gapsmall vertical effectSelect :optionscharacterOptions v-modelstate.character / /Flex /Col Col :span6 v-ifstate.character custom-character Flex gapsmall vertical character:Input v-model:valuestate.customCharacter placeholdercustomCharacter / /Flex /Col /Row Badge :valuevalue stylemargin-top: 30px Rate v-bindstate :characterstate.character custom-character ? state.customCharacter : state.character v-model:valuevalue / /Badge /div /template

相关新闻

Vue3二维码(QRCode)

Vue3二维码(QRCode)

2026/8/29 13:10:21

可自定义设置以下属性: 扫描后的文本或地址(value),类型:string,默认 undefined 二维码的渲染类型(type),类型:svg | canvas | image,默认 svg …

Vue3图片(Image)

Vue3图片(Image)

2026/8/29 13:10:21

本图片预览组件主要包括以下功能: 展示图片时,可设置鼠标悬浮时的预览文本;图像无法加载时要显示的描述;自定义图像高度和宽度;设置图像如何适应容器高度和宽度(fill | contain | cover | none | scale-dow…

Vue3空状态(Empty)

Vue3空状态(Empty)

2026/8/29 13:10:21

可自定义设置以下属性: 自定义描述内容(description),类型:string | slot | null,默认 暂无数据 设置描述文本的样式(descriptionStyle),类型:CSSPropertie…

AI Coding全景指南:从工具选择到工程化落地实践

AI Coding全景指南:从工具选择到工程化落地实践

2026/8/29 14:10:23

这两年“AI Coding”几乎是从工具圈一路火到了管理层。打开技术社区,满屏都是“AI 辅助编程”“AI Agent 写代码”的话题;打开招聘 JD,不少岗位也把“熟悉 AI 编程工具”写成了加分项。但真正在一线把 AI 用到生产项目里的团队,往…

从“光”到“色”:一文拆解TFT液晶屏如何用晶体管“画”出千万色彩

从“光”到“色”:一文拆解TFT液晶屏如何用晶体管“画”出千万色彩

2026/8/29 14:10:23

1. 从白光到彩色:TFT液晶屏的成像之旅 当你盯着手机屏幕刷短视频时,是否想过这千万种色彩是如何被"画"出来的?这背后是一场光与电的精密共舞。TFT液晶屏的成像过程就像个高效协作的工厂流水线: 背光模组 是发电站&…

基于51单片机的门禁系统设计:从矩阵键盘到EEPROM存储的综合实践

基于51单片机的门禁系统设计:从矩阵键盘到EEPROM存储的综合实践

2026/8/29 14:10:23

1. 项目背景与赛题核心解读 最近在整理一些老项目的资料,翻到了当年参加蓝桥杯第三届单片机国赛的题目——“门禁系统”。这个题目可以说是一个经典的综合应用案例,它不像一些单纯考某个外设驱动的题目,而是把单片机开发中常见的几个核心模块…

Ubuntu 安装docker docker-compose

Ubuntu 安装docker docker-compose

2026/8/29 14:10:23

Docker 通过提供轻量级、可移植且高效的解决方案,简化了软件开发和部署。“docker build”命令是 Docker 镜像创建过程的核心。本文将探讨 Docker 构建命令、用法以及 Docker 构建的优化。Docker 构建有什么作用?Docker build 是一个命令行界面 CLI命令&…

自主行动AI Agent实战:从零搭建自动操作网页的智能体

自主行动AI Agent实战:从零搭建自动操作网页的智能体

2026/8/29 14:10:23

这次我们来看一个 Agent 自主行动的真实案例:为了让用户抢到热门健身课的一个名额,一个 AI Agent 自己完成了一整套网页操作,最终拿到了结果。新闻标题用了 “Rogue AI agent hacks gym” 来形容它,其实多数时候这不是在攻击系统漏…

AI 编码新范式:SHA 绑定 spec 审批,从 issue 到 reviewed PR

AI 编码新范式:SHA 绑定 spec 审批,从 issue 到 reviewed PR

2026/8/29 14:00:23

AgentMachinist 这个项目在 Show HN 上展示的核心信息很短:issue to reviewed PR。从一个 issue 出发,最后得到一个经过审查的 pull request。很多 AI 编程工具现在都能做到“从 issue 生成 PR”,但 reviewed 这个限定词,让它的思…

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

2026/8/27 11:10:02

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

2026/8/29 10:22:10

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

2026/8/28 7:34:42

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

四款热门降AI工具测评:研究生和本科生怎么选?

四款热门降AI工具测评:研究生和本科生怎么选?

2026/8/29 0:09:39

马上要交论文了,最近真的被论文ai率折磨的够呛。 明明查重都没问题了,但是ai率就是居高不下,崩溃了,明明都是我自己写的,天杀的,明明都是我亲生的啊 改来改去,终于给我搞出一套完美的降ai方案…

论文降AI率免费攻略:自查、提示词与工具推荐

论文降AI率免费攻略:自查、提示词与工具推荐

2026/8/29 0:09:39

马上要交论文了,最近真的被论文ai率折磨的够呛。 明明查重都没问题了,但是ai率就是居高不下,崩溃了,明明都是我自己写的,天杀的,明明都是我亲生的啊 改来改去,终于给我搞出一套完美的降ai方案…

北京GEO优化服务商推荐:预算型企业如何选北京GEO优化服务商?

北京GEO优化服务商推荐:预算型企业如何选北京GEO优化服务商?

2026/8/29 0:09:39

前言:预算有限的企业更关心投入能否形成可持续的品牌资产。评估北京GEO优化服务商时,不能只比较单篇内容或单月报价,还要看是否能够把问题词、官网、信源和监测串成完整链路。本期重点放在预算配置、试点范围和交付边界,帮助企业先…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/28 7:35:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/28 7:34:51

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/28 7:34:35

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…