102 lines
2.2 KiB
Vue
Raw Normal View History

2025-07-15 16:18:34 +08:00
<template>
<view class="radio_body" :style="props?.radioStyle">
<view
v-for="(i, index) in getEnums()"
:key="`item_${index}`"
2026-01-15 19:26:00 +08:00
:class="`item item_${props?.size} ${props?.disableds?.includes(i?.value) ? 'disabled' : ''}`"
:style="i?.value === props?.valueModel || i?.value === selectValue ? getStyleInfo() : ''"
2025-07-15 16:18:34 +08:00
@click="onClick(i)"
>
{{ i?.text }}
</view>
</view>
</template>
<script lang="ts" setup>
import { onMounted, ref, watch } from 'vue'
2026-01-15 19:26:00 +08:00
import { getStyleBgInfo } from '@/common/libraries/getPageConfig'
2025-07-15 16:18:34 +08:00
interface EnumItem {
text?: string
value?: string
}
const props = defineProps([
'valueModel',
'Enums',
'size',
'radioStyle',
'selectStyle',
'disableds' // 不可选数组 6-7 kfyy 7.40 cook
])
const selectValue = ref('')
2026-01-15 19:26:00 +08:00
const getStyleInfo = () => {
return {
...props.selectStyle,
...getStyleBgInfo()
}
}
2025-07-15 16:18:34 +08:00
const getEnums = (): any => {
let list: EnumItem[] = Object.entries(props?.Enums as Record<string, EnumItem>).map(
([_key, value]) => ({
text: value.text,
value: value.value
})
)
return list
}
watch(
() => props?.valueModel,
() => {
console.log('mounted2', props?.valueModel)
selectValue.value = props?.valueModel
}
)
const emit = defineEmits(['update:valueModel', 'onChange'])
const onClick = (e: { value: string }) => {
if (props?.disableds?.includes(e?.value)) {
return false
}
selectValue.value = e?.value
emit('update:valueModel', e?.value)
emit('onChange', e)
}
onMounted(() => {
console.log('mounted1', props?.valueModel)
if (props?.valueModel) {
selectValue.value = props?.valueModel
}
})
</script>
<style lang="scss" scoped>
.radio_body {
display: flex;
align-items: center;
flex-wrap: wrap;
.item {
padding: 0 27rpx;
font-size: 26rpx;
height: 60rpx;
line-height: 60rpx;
color: #333;
text-align: center;
display: flex;
align-items: center;
justify-content: center;
background-color: #f3f3f4;
border-radius: 6rpx;
margin-right: 15rpx;
&:last-child {
margin: 0;
}
}
.active {
2025-08-29 09:51:02 +08:00
color: #fff;
background-color: #2a7efb;
2025-07-15 16:18:34 +08:00
}
.disabled {
opacity: 0.7;
}
}
</style>