54def6aa创建于 2025年8月14日历史提交
<template>
	<div class="flex-row align-c gap-6 flex-wrap" :class="disaled ? 'is-disable' : 'no-disable'">
		<div v-for="(item, index) in Array(props.max)" :key="index" class="rate-item">
			<template v-if="props.type !== '2'">
				<template v-if="index < new_selected">
					<icon :name="props.type == '0' ? 'pointed' : 'the-heart'" size="16" class="w h" :color="props.selectColor" @mousemove="mousemove(index + 1)" @mouseleave="mouseleave(index + 1)" @click="icon_click(index + 1)"></icon>
				</template>
				<template v-else>
					<icon :name="props.type == '0' ? 'pointed-o' : 'the-heart-o'" size="16" class="w h" color="#ccc" @mousemove="mousemove(index + 1)" @mouseleave="mouseleave(index + 1)" @click="icon_click(index + 1)"></icon>
				</template>
			</template>
			<template v-else>
				<template v-if="index + 1 == new_selected">
					<span class="rate-divide-name nowrap" :style="`color:${ props.selectColor };font-size:${ size }px;`" @click="icon_click(index + 1)">{{ index + 1 }}分</span>
				</template>
				<template v-else>
					<span class="rate-divide-name nowrap" :style="`font-size:${ size }px;`" @click="icon_click(index + 1)">{{ index + 1 }}分</span>
				</template>
			</template>
		</div>
	</div>
</template>

<script lang="ts" setup>
import { cloneDeep } from 'lodash';
const props = defineProps({
	max: {
		type: Number,
		default: 5,
	},
	type: {
		type: String,
		default: '0',
	},
	selectColor: {
		type: String,
		default: '#f7ba2a'
	},
	disaled: {
		type: Boolean,
		default: false
	},
    size: {
        type: String,
        default: '10'
    }
});
const selected = defineModel({ type: Number, default: 1 });
const new_selected = ref(0);
watch(() => selected.value, (val: number) => {
  	new_selected.value = cloneDeep(val);
}, {immediate: true, deep: true});
const mousemove = (index: number) => {
	if (!props.disaled) {
		new_selected.value = index;
	}
}
const mouseleave = (index: number) => {
	if (!props.disaled) {
		new_selected.value = cloneDeep(selected.value);
	}
}
const emit = defineEmits(['change']);
// 点击事件触发
const icon_click = (index: number) => {
	if (!props.disaled) {
		if (index == selected.value) {
			new_selected.value = 0;
			selected.value = 0;
		} else {
			new_selected.value = index;
			selected.value = index;
		}
		emit('change', selected.value);
	}
}
</script>

<style lang="scss" scoped>
.rate-item {
    // width: 1.6rem;
    height: 1.6rem;
}
.is-disable {
	cursor: auto;
	i.iconfont:hover {
		opacity: 1;
	}
}
.no-disable {
	cursor: pointer;
	i.iconfont:hover {
		opacity: 1;
	}
}
.rate-divide-name {
	font-weight: 400;
	font-size: 1rem;
	color: #666666;
	line-height: 1.4rem;
	text-align: right;
	font-style: normal;
}
</style>