uniapp——信号值组件(vue3)

组件代码

html 复制代码
<template>
	<view>
		<view class="signals">
			<view v-for="(item, index) in signals" :key="index" class="signal" :style="item"></view>
		</view>
	</view>
</template>

<script setup>
	/**
	 * 信号格组件
	 * @description 信号格组件
	 * @property {Number}			signal			当前信号值
	 * @property {Number|String}	columnWidth		柱宽度
	 * @property {Number}			maxSignal		最大信号值
	 * @property {Number}			bisection		信号等分
	 * @property {String}			lowColor		信号低颜色
	 * @property {String}			midColor		信号中颜色
	 * @property {String}			highColor		信号高颜色
	 * @property {String}			nothingColor	信号空颜色
	 * @example <signal :signal="31"></signal>
	 */
	import {
		ref,
		watch,
		defineProps
	} from 'vue'

	const props = defineProps({
		signal: {
			type: Number,
			default: 31,
		},
		columnWidth: {
			type: [Number, String],
			default: 2,
		},
		maxSignal: {
			type: Number,
			default: 31,
		},
		bisection: {
			type: Number,
			default: 4,
		},
		lowColor: {
			type: String,
			default: '#13AD11',
		},
		midColor: {
			type: String,
			default: '#13AD11',
		},
		highColor: {
			type: String,
			default: '#13AD11',
		},
		nothingColor: {
			type: String,
			default: '#c8c9cc',
		}
	})

	const initHeight = ref(1)
	const signals = ref([])

	const doChanges = () => {
		const x = props.maxSignal / props.bisection
		let min = 0
		let max = x
		const list = []

		for (let i = 0; i < props.bisection; i++) {
			let color
			if (i === 0) {
				color = props.lowColor
			} else if (i > 0 && i < props.bisection - 1) {
				color = props.midColor
			} else if (i === props.bisection - 1) {
				color = props.highColor
			}
			list.push({
				min: Math.floor(min),
				max: Math.floor(max),
				color: color
			})
			min = max
			max += x
		}

		let color
		if (props.signal >= props.maxSignal) {
			color = props.highColor
		} else if (props.signal === 0) {
			color = props.nothingColor
		} else {
			list.forEach((items) => {
				if (props.signal >= items.min && props.signal < items.max) {
					color = items.color
				}
			})
		}

		list.forEach((items) => {
			if (props.signal >= items.min) {
				items.color = color
			} else {
				items.color = props.nothingColor
			}
		})

		signals.value = list.map((items) => ({
			width: `${props.columnWidth}px`,
			height: `${initHeight.value += 1}px`,
			backgroundColor: items.color
		}))
	}

	watch(() => [props.signal, props.columnWidth, props.maxSignal, props.bisection, props.lowColor, props.midColor, props
		.highColor, props.nothingColor
	], doChanges, {
		deep: true,
		immediate: true
	})

	doChanges()
</script>

<style lang="scss">
	.signals {
		display: flex;
		align-items: baseline;

		.signal {
			border-radius: 50rpx;
			margin: 0 1px;
		}
	}
</style>

使用代码

引入:

html 复制代码
import Signal from '@/components/signal/signal.vue'

使用:

html 复制代码
<Signal :signal="info.signal" style="margin-right: 10rpx;"></Signal>
相关推荐
国服第二切图仔3 分钟前
Electron for鸿蒙pc项目实战之下拉菜单组件
javascript·electron·harmonyos·鸿蒙pc
国服第二切图仔6 分钟前
electron for 鸿蒙PC项目实战之loading-animation组件
javascript·electron·鸿蒙pc
软件技术NINI10 分钟前
html css js网页制作成品——敖瑞鹏html+css+js 4页附源码
javascript·css·html
程序员小寒19 分钟前
Vue.js 为什么要推出 Vapor Mode?
前端·javascript·vue.js
白菜__26 分钟前
去哪儿小程序逆向分析(酒店)
前端·javascript·爬虫·网络协议·小程序·node.js
前端老曹27 分钟前
Jspreadsheet CE V5 使用手册(保姆版) 二
开发语言·前端·vue.js·学习
老华带你飞33 分钟前
动物救助|流浪狗救助|基于Springboot+vue的流浪狗救助平台设计与实现(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·流浪动物救助平台
困惑阿三1 小时前
深入理解 JavaScript 中的(Promise.race)
开发语言·前端·javascript·ecmascript·reactjs
我命由我123451 小时前
微信小程序 bind:tap 与 bindtap 的区别
开发语言·前端·javascript·微信小程序·小程序·前端框架·js
5335ld1 小时前
vue2 直播地址播放 兼容浏览器
前端·vue.js