UNPKG

kui-vue

Version:

A lightweight desktop UI component library suitable for Vue.js 2.

89 lines (85 loc) 2.22 kB
import Icon from "../icon"; import { Loading } from "kui-icons"; import { defineComponent, ref, watch } from "vue"; import { withInstall } from "../utils/vue"; const Switch = defineComponent({ name: "KSwitch", model: { prop: "checked", event: "input", }, props: { checked: { type: [Boolean, Number], default: false, }, // checked: [Boolean, Number], //for 3 type: String, disabled: Boolean, loading: Boolean, size: { default: "default", validator(value) { return ["small", "default", "large"].indexOf(value) >= 0; }, }, trueText: String, falseText: String, }, setup(ps, { slots, emit }) { const isChecked = ref(ps.checked); watch( () => ps.checked, (nv, no) => { isChecked.value = nv; } ); const change = () => { if (ps.disabled) { return false; } const checked = !isChecked.value; isChecked.value = checked; // emit("update:checked", checked); //for 3 emit("input", checked); //for 3 emit("change", checked); }; return () => { const { type, trueText, falseText, disabled, loading, size } = ps; const classes = [ "k-switch", { ["k-switch-checked"]: isChecked.value, ["k-switch-disabled"]: disabled || loading, [`k-switch-${type}`]: !!type, ["k-switch-sm"]: ps.size == "small", }, ]; const children = slots.checked?.() || trueText || slots.unchecked?.() || falseText; const loadNode = loading ? ( <Icon spin type={Loading} class="k-switch-loading" /> ) : null; const textNode = size != "small" && children ? ( <span class="k-switch-inner"> {isChecked.value ? slots.checked?.() || trueText : slots.unchecked?.() || falseText} </span> ) : null; return ( <button class={classes} onClick={change} disabled={disabled || loading} type="button" > {textNode} {loadNode} </button> ); }; }, }); export default withInstall(Switch);