|
|
- <template>
- <view class="l-radio" :class="{'l-radio--disabled': isDisabled}" :style="[styles]" @click="onClick">
- <slot name="radio" :checked="radioChecked" :disabled="isDisabled">
- <slot name="icon" :checked="radioChecked" :disabled="isDisabled">
- <view class="l-radio__icon" ref="iconRef"
- :class="['l-radio__icon--' + innerIcon, {
- 'l-radio__icon--checked': radioChecked,
- 'l-radio__icon--disabled': isDisabled
- }]" :style="[iconStyle]"></view>
- </slot>
- <view class="l-radio__label" :class="{'l-radio__label--disabled': isDisabled}" v-if="label || $slots['default']">
- <slot>{{label}}</slot>
- </view>
- </slot>
- </view>
- </template>
- <script lang="ts">
- // @ts-nocheck
- import { defineComponent, computed, inject, Ref , ref} from '@/uni_modules/lime-shared/vue';
- import { RadioValue, LRadioProps } from './type'
- import radioProps from './props'
-
- const name = 'l-radio'
- export default defineComponent({
- name,
- props: radioProps,
- emits: ['update:checked', 'update:modelValue', 'change', 'input'],
- setup(props, { emit }) {
- const radioGroupProps = inject<LRadioGroupComponentPublicInstance|null>('limeRadioGroupProps', null);
- const radioGroupValue = inject<ComputedRefImpl<any>|null>('limeRadioGroupValue', null);
- const radioGroupChange = inject<((value: any|null) => void)|null>('limeRadioGroupChange', null);
- const modelValue = ref(props.checked || props.modelValue)
- const innerChecked = computed({
- set(value: boolean){
- modelValue.value = value;
- emit('update:modelValue', value)
- emit('change', value)
- // #ifdef VUE2
- emit('input', value)
- // #endif
- },
- get(): boolean{
- return props.checked || props.modelValue || modelValue.value
- },
- } as WritableComputedOptions<boolean>)
-
- const isDisabled = computed(():boolean => (props.disabled || (radioGroupProps?.disabled)))
- const radioChecked = computed(():boolean => innerChecked.value || (props.name && props.name == radioGroupValue?.value) || (props.value && props.value == radioGroupValue?.value));
- const finalAllowUncheck = computed(():boolean => props.allowUncheck || (radioGroupProps?.allowUncheck));
-
- const innerIcon = computed(():string => radioGroupProps?.icon || props.icon)
- const innerSize = computed(():string => radioGroupProps?.size || props.size)
- const innerIconSize = computed(():string|null => radioGroupProps?.iconSize || props.iconSize)
- const innerFontSize = computed(():string|null => radioGroupProps?.fontSize || props.fontSize)
- const innerCheckedColor = computed(():string|null => radioGroupProps?.checkedColor || props.checkedColor)
- const innerIconBgColor = computed(():string => props.iconBgColor || radioGroupProps?.iconBgColor)
- const innerIconBorderColor = computed(():string => props.iconBorderColor || radioGroupProps?.iconBorderColor )
- const innerIconDisabledColor = computed(():string => props.iconDisabledColor || radioGroupProps?.iconDisabledColor)
- const innerIconDisabledBgColor = computed(():string => props.iconDisabledBgColor || radioGroupProps?.iconDisabledBgColor)
-
-
- const styles = computed(()=>{
- const style:Record<string, any> = {};
- if(radioGroupProps&& radioGroupProps.gap) {
- style[radioGroupProps.direction == 'horizontal' ? 'margin-right' : 'margin-bottom'] = radioGroupProps.gap!
- }
-
- if(innerCheckedColor.value) {
- style['--l-radio-icon-checked-color'] = innerCheckedColor.value!
- }
- if(innerIconBorderColor.value) {
- style['--l-radio-icon-border-color'] = innerIconBorderColor.value!
- }
- if(innerIconDisabledColor.value) {
- style['--l-radio-icon-disabled-color'] = innerIconDisabledColor.value!
- }
- if(innerIconDisabledBgColor.value) {
- style['--l-radio-icon-disabled-bg-color'] = innerIconDisabledBgColor.value!
- }
- if(innerFontSize.value) {
- style['--l-radio-font-size'] = innerFontSize.value!
- }
- if(innerIconBgColor.value) {
- style['--l-radio-icon-bg-color'] = innerIconBgColor.value!
- }
- return style
- })
-
- const iconStyle = computed(()=>{
- const style:Record<string, any> = {}
- if(innerIconSize.valuel) {
- style['width'] = innerIconSize.value!
- style['height'] = innerIconSize.value!
- style['--l-radio-icon-size'] = innerIconSize.value!
- }
- return style
- })
-
-
-
- const onClick = (e: UniPointerEvent) => {
- if(isDisabled.value) return;
- const _name = props.value || props.name
- if(radioGroupChange && _name) {
- const value = finalAllowUncheck.value && radioChecked.value ? null : _name;
- radioGroupChange(value);
- } else {
- const value = finalAllowUncheck.value ? !radioChecked.value : true;
- innerChecked.value = value
- }
- }
-
- return {
- styles,
- innerChecked,
- iconStyle,
- innerIcon,
- radioChecked,
- isDisabled,
- onClick,
-
- }
- }
- });
- </script>
- <style lang="scss">
- @import './index-u';
- </style>
|