@extclp/vexip-ui
Version:
A Vue 3 UI library, Highly customizability, full TypeScript, performance pretty good
1 lines • 7.54 kB
Source Map (JSON)
{"version":3,"file":"radio.vue2.mjs","sources":["../../../components/radio/radio.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { CollapseTransition } from '@/components/collapse-transition'\nimport { Icon } from '@/components/icon'\n\nimport { computed, inject, onBeforeUnmount, onMounted, ref, watch } from 'vue'\n\nimport {\n createSizeProp,\n createStateProp,\n emitEvent,\n useIcons,\n useNameHelper,\n useProps\n} from '@vexip-ui/config'\nimport { radioProps } from './props'\nimport { GROUP_STATE, radioShapes } from './symbol'\n\nimport type { ChangeEvent } from './symbol'\n\ndefineOptions({ name: 'Radio' })\n\nconst _props = defineProps(radioProps)\nconst props = useProps('radio', _props, {\n size: createSizeProp(),\n state: createStateProp(),\n value: {\n default: null,\n static: true\n },\n label: {\n default: null,\n static: true,\n required: true\n },\n labelClass: null,\n disabled: false,\n tabIndex: 0,\n loading: false,\n loadingLock: false,\n name: {\n default: '',\n static: true\n },\n shape: {\n default: 'default',\n validator: value => radioShapes.includes(value)\n }\n})\n\nconst emit = defineEmits(['update:value'])\n\ndefineSlots<{ default: () => any, extra: () => any }>()\n\nconst groupState = inject(GROUP_STATE, null)\n\nconst nh = useNameHelper('radio')\nconst icons = useIcons()\nconst currentValue = ref(props.value)\n\nconst input = ref<HTMLInputElement>()\n\nconst size = computed(() => groupState?.size || props.size)\nconst state = computed(() => groupState?.state || props.state)\nconst isDisabled = computed(() => groupState?.disabled || props.disabled)\nconst isLoading = computed(() => groupState?.loading || props.loading)\nconst loadingIcon = computed(() => groupState?.loadingIcon)\nconst isLoadingLock = computed(() => groupState?.loadingLock || false)\nconst loadingEffect = computed(() => groupState?.loadingEffect || '')\nconst shape = computed(() => groupState?.shape || props.shape)\nconst readonly = computed(() => isLoading.value && isLoadingLock.value)\nconst className = computed(() => {\n return [\n nh.b(),\n nh.bs('vars'),\n {\n [nh.bm('inherit')]: props.inherit,\n [nh.bm('checked')]: currentValue.value === props.label,\n [nh.bm('disabled')]: isDisabled.value,\n [nh.bm('readonly')]: readonly.value,\n [nh.bm('loading')]: isLoading.value,\n [nh.bm(size.value)]: size.value !== 'default',\n [nh.bm(state.value)]: state.value !== 'default',\n [nh.bm(shape.value)]: shape.value !== 'default' && shape.value !== 'button-group'\n }\n ]\n})\nconst isButton = computed(() => shape.value === 'button' || shape.value === 'button-group')\n\nwatch(\n () => props.value,\n value => {\n currentValue.value = value\n }\n)\n\nif (groupState) {\n currentValue.value = groupState.currentValue\n\n watch(() => groupState.currentValue, emitChange)\n\n onMounted(() => {\n groupState.registerInput(input)\n })\n\n onBeforeUnmount(() => {\n groupState.unregisterInput(input)\n })\n}\n\ndefineExpose({ currentValue, input })\n\nfunction emitChange(value: string | number | boolean) {\n if (currentValue.value === value) return\n\n currentValue.value = value\n\n emit('update:value', value)\n emitEvent(props.onChange as ChangeEvent, value)\n}\n\nfunction handleChange() {\n if (isDisabled.value || readonly.value) {\n return\n }\n\n emitChange(props.label)\n\n if (groupState && currentValue.value === props.label) {\n groupState.updateValue(currentValue.value)\n }\n}\n</script>\n\n<template>\n <label :class=\"className\">\n <input\n ref=\"input\"\n type=\"radio\"\n :class=\"nh.be('input')\"\n :checked=\"currentValue === props.label\"\n :disabled=\"isDisabled || readonly\"\n :tabindex=\"props.tabIndex\"\n :name=\"props.name\"\n @submit.prevent\n @change=\"handleChange\"\n @click.stop\n />\n <span :class=\"[nh.be('signal'), isLoading && nh.bem('signal', 'active')]\"></span>\n <span :class=\"[nh.be('label'), props.labelClass]\">\n <CollapseTransition\n v-if=\"isButton\"\n appear\n horizontal\n fade-effect\n >\n <div v-if=\"isLoading\" :class=\"nh.be('loading')\">\n <Icon\n v-bind=\"icons.loading\"\n :effect=\"loadingEffect || icons.loading.effect\"\n :icon=\"loadingIcon || icons.loading.icon\"\n label=\"loading\"\n ></Icon>\n </div>\n </CollapseTransition>\n <slot>{{ props.label }}</slot>\n <span :class=\"nh.be('extra')\" @click.capture.prevent>\n <slot name=\"extra\"></slot>\n </span>\n </span>\n </label>\n</template>\n"],"names":["props","useProps","__props","createSizeProp","createStateProp","value","radioShapes","emit","__emit","groupState","inject","GROUP_STATE","nh","useNameHelper","icons","useIcons","currentValue","ref","input","size","computed","state","isDisabled","isLoading","loadingIcon","isLoadingLock","loadingEffect","shape","readonly","className","isButton","watch","emitChange","onMounted","onBeforeUnmount","__expose","emitEvent","handleChange"],"mappings":"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"}