Skip to content

Commit b8d3aca

Browse files
committed
refactor(switch): support customize checked value vueComponent#4329
1 parent 16ee0dd commit b8d3aca

File tree

1 file changed

+14
-10
lines changed

1 file changed

+14
-10
lines changed

components/switch/index.tsx

+14-10
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ const switchProps = {
3131
autofocus: PropTypes.looseBool,
3232
loading: PropTypes.looseBool,
3333
checked: PropTypes.looseBool,
34+
trueValue: PropTypes.any.def(true),
35+
falseValue: PropTypes.any.def(false),
3436
onChange: PropTypes.func,
3537
onClick: PropTypes.func,
3638
onKeydown: PropTypes.func,
@@ -59,12 +61,15 @@ const Switch = defineComponent({
5961
'`value` is not validate prop, do you mean `checked`?',
6062
);
6163
});
62-
const checked = ref(props.checked !== undefined ? !!props.checked : !!attrs.defaultChecked);
64+
const checked = ref(props.checked !== undefined ? props.checked : attrs.defaultChecked);
65+
const checkedStatus = computed(() => {
66+
return checked.value === props.trueValue;
67+
});
6368

6469
watch(
6570
() => props.checked,
6671
() => {
67-
checked.value = !!props.checked;
72+
checked.value = props.checked;
6873
},
6974
);
7075

@@ -92,29 +97,26 @@ const Switch = defineComponent({
9297
});
9398
});
9499

95-
const setChecked = (check: boolean, e: MouseEvent | KeyboardEvent) => {
100+
const setChecked = (check: any, e: MouseEvent | KeyboardEvent) => {
96101
if (props.disabled) {
97102
return;
98103
}
99-
if (props.checked === undefined) {
100-
checked.value = check;
101-
}
102104
emit('update:checked', check);
103105
emit('change', check, e);
104106
};
105107

106108
const handleClick = (e: MouseEvent) => {
107109
focus();
108-
const newChecked = !checked.value;
110+
const newChecked = checkedStatus.value ? props.falseValue : props.trueValue;
109111
setChecked(newChecked, e);
110112
emit('click', newChecked, e);
111113
};
112114

113115
const handleKeyDown = (e: KeyboardEvent) => {
114116
if (e.keyCode === KeyCode.LEFT) {
115-
setChecked(false, e);
117+
setChecked(props.falseValue, e);
116118
} else if (e.keyCode === KeyCode.RIGHT) {
117-
setChecked(true, e);
119+
setChecked(props.trueValue, e);
118120
}
119121
emit('keydown', e);
120122
};
@@ -133,6 +135,8 @@ const Switch = defineComponent({
133135
'checked',
134136
'autofocus',
135137
'defaultChecked',
138+
'trueValue',
139+
'falseValue',
136140
])}
137141
{...attrs}
138142
onKeydown={handleKeyDown}
@@ -147,7 +151,7 @@ const Switch = defineComponent({
147151
[prefixCls.value]: true,
148152
[`${prefixCls.value}-small`]: props.size === 'small',
149153
[`${prefixCls.value}-loading`]: props.loading,
150-
[`${prefixCls.value}-checked`]: checked.value,
154+
[`${prefixCls.value}-checked`]: checkedStatus.value,
151155
[`${prefixCls.value}-disabled`]: props.disabled,
152156
}}
153157
ref={refSwitchNode}

0 commit comments

Comments
 (0)