vant/packages/radio/index.js

102 lines
2.0 KiB
JavaScript

import { use } from '../utils';
import Icon from '../icon';
import findParent from '../mixins/find-parent';
const [sfc, bem] = use('radio');
export default sfc({
mixins: [findParent],
props: {
name: null,
value: null,
disabled: Boolean,
checkedColor: String,
labelPosition: String,
labelDisabled: Boolean,
shape: {
type: String,
default: 'round'
}
},
computed: {
currentValue: {
get() {
return this.parent ? this.parent.value : this.value;
},
set(val) {
(this.parent || this).$emit('input', val);
}
},
isDisabled() {
return this.parent ? this.parent.disabled || this.disabled : this.disabled;
},
iconStyle() {
const { checkedColor } = this;
if (checkedColor && this.currentValue === this.name && !this.isDisabled) {
return {
borderColor: checkedColor,
backgroundColor: checkedColor
};
}
}
},
created() {
this.findParent('van-radio-group');
},
methods: {
onClickIcon() {
if (!this.isDisabled) {
this.currentValue = this.name;
}
},
onClickLabel() {
if (!this.isDisabled && !this.labelDisabled) {
this.currentValue = this.name;
}
}
},
render(h) {
const checked = this.currentValue === this.name;
const CheckIcon = this.$scopedSlots.icon ? (
this.$scopedSlots.icon({ checked })
) : (
<Icon name="success" style={this.iconStyle} />
);
const Label = this.$slots.default && (
<span
class={bem('label', [this.labelPosition, { disabled: this.isDisabled }])}
onClick={this.onClickLabel}
>
{this.$slots.default}
</span>
);
return (
<div
class={bem()}
onClick={() => {
this.$emit('click');
}}
>
<div
class={bem('icon', [this.shape, { disabled: this.isDisabled, checked }])}
onClick={this.onClickIcon}
>
{CheckIcon}
</div>
{Label}
</div>
);
}
});