kui-vue
Version:
A high quality UI Toolkit built on Vue.js 2.0
83 lines (80 loc) • 2.19 kB
JSX
import { hasProp } from '../_tool/utils'
export default {
name: "Radio",
props: {
value: { type: [String, Number, Boolean], default: false },
disabled: Boolean,
checked: [Boolean, Number],
label: [String, Number],
size: {
default: 'default',
validator(value) {
return ["small", "large", "default"].indexOf(value) >= 0;
}
},
},
inject: {
groupContext: { default: null },
},
model: {
prop: 'checked',
},
data() {
const checked = hasProp(this, 'checked') ? this.checked : this.value === true
return {
defaultChecked: checked,
}
},
// watch: {
// checked(checked) {
// this.$emit("input", checked);
// }
// },
methods: {
change(e) {
let { disabled, value, $slots, label, groupContext } = this
if (disabled) {
return false;
}
const checked = e.target.checked;
this.defaultChecked = checked;
if (groupContext) {
label = label || $slots.default.text
this.groupContext.change({ label, value })
} else {
this.$emit("input", checked);
this.$emit("change", e);
}
}
},
render() {
let { disabled, change, $slots, label, size, groupContext, value, checked, defaultChecked } = this
if (groupContext) {
checked = groupContext.defaultValue == value
disabled = disabled || groupContext.disabled
size = groupContext.size
} else {
if (!hasProp(this, 'checked')) {
checked = defaultChecked
}
}
const wpclasses = [
"k-radio", {
["k-radio-disabled"]: disabled,
["k-radio-checked"]: checked,
["k-radio-lg"]: size == 'large',
["k-radio-sm"]: size == 'small',
}
];
const labelNode = label || $slots.default
return (
<label class={wpclasses} onClick={e => e.stopPropagation()}>
<span class="k-radio-symbol">
<input type="radio" class="k-radio-input" disabled={disabled} checked={checked} onChange={change} />
<span class="k-radio-inner"></span>
</span>
{labelNode ? <span class="k-radio-label">{labelNode}</span> : null}
</label>
)
}
};