perf: add more prop type utils (#9641)

* perf: add more prop type utils

* fix: slider type

* chore: uod
This commit is contained in:
neverland 2021-10-08 15:41:50 +08:00 committed by GitHub
parent 78bcd368ae
commit 00bb1d2f1f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
34 changed files with 174 additions and 242 deletions

View File

@ -16,6 +16,7 @@ import {
isMobile, isMobile,
truthProp, truthProp,
numericProp, numericProp,
makeArrayProp,
makeNumericProp, makeNumericProp,
createNamespace, createNamespace,
} from '../utils'; } from '../utils';
@ -75,6 +76,7 @@ const props = {
showSearchResult: Boolean, showSearchResult: Boolean,
detailRows: makeNumericProp(1), detailRows: makeNumericProp(1),
detailMaxlength: makeNumericProp(200), detailMaxlength: makeNumericProp(200),
areaColumnsPlaceholder: makeArrayProp<string>(),
addressInfo: { addressInfo: {
type: Object as PropType<Partial<AddressEditInfo>>, type: Object as PropType<Partial<AddressEditInfo>>,
default: () => extend({}, DEFAULT_DATA), default: () => extend({}, DEFAULT_DATA),
@ -87,10 +89,6 @@ const props = {
type: Function as PropType<(val: string) => boolean>, type: Function as PropType<(val: string) => boolean>,
default: isPostal, default: isPostal,
}, },
areaColumnsPlaceholder: {
type: Array as PropType<string[]>,
default: () => [],
},
}; };
export type AddressEditProps = ExtractPropTypes<typeof props>; export type AddressEditProps = ExtractPropTypes<typeof props>;

View File

@ -1,7 +1,12 @@
import { PropType, defineComponent } from 'vue'; import { defineComponent } from 'vue';
// Utils // Utils
import { truthProp, numericProp, createNamespace } from '../utils'; import {
truthProp,
numericProp,
makeArrayProp,
createNamespace,
} from '../utils';
// Components // Components
import { Button } from '../button'; import { Button } from '../button';
@ -14,19 +19,13 @@ export default defineComponent({
name, name,
props: { props: {
list: makeArrayProp<AddressListAddress>(),
modelValue: numericProp, modelValue: numericProp,
switchable: truthProp, switchable: truthProp,
disabledText: String, disabledText: String,
disabledList: makeArrayProp<AddressListAddress>(),
addButtonText: String, addButtonText: String,
defaultTagText: String, defaultTagText: String,
list: {
type: Array as PropType<AddressListAddress[]>,
default: () => [],
},
disabledList: {
type: Array as PropType<AddressListAddress[]>,
default: () => [],
},
}, },
emits: [ emits: [

View File

@ -1,7 +1,7 @@
import { PropType, defineComponent } from 'vue'; import { PropType, defineComponent } from 'vue';
// Utils // Utils
import { createNamespace, extend } from '../utils'; import { createNamespace, extend, makeRequiredProp } from '../utils';
// Components // Components
import { Tag } from '../tag'; import { Tag } from '../tag';
@ -23,13 +23,10 @@ export default defineComponent({
name, name,
props: { props: {
address: makeRequiredProp<PropType<AddressListAddress>>(Object),
disabled: Boolean, disabled: Boolean,
switchable: Boolean, switchable: Boolean,
defaultTagText: String, defaultTagText: String,
address: {
type: Object as PropType<AddressListAddress>,
required: true,
},
}, },
emits: ['edit', 'click', 'select'], emits: ['edit', 'click', 'select'],

View File

@ -12,7 +12,13 @@ import {
// Utils // Utils
import { deepClone } from '../utils/deep-clone'; import { deepClone } from '../utils/deep-clone';
import { pick, createNamespace, extend, makeNumericProp } from '../utils'; import {
pick,
extend,
makeArrayProp,
makeNumericProp,
createNamespace,
} from '../utils';
import { pickerProps } from '../picker/Picker'; import { pickerProps } from '../picker/Picker';
// Composables // Composables
@ -51,6 +57,7 @@ const isOverseaCode = (code: string) => code[0] === '9';
const props = extend({}, pickerProps, { const props = extend({}, pickerProps, {
value: String, value: String,
columnsNum: makeNumericProp(3), columnsNum: makeNumericProp(3),
columnsPlaceholder: makeArrayProp<string>(),
areaList: { areaList: {
type: Object as PropType<AreaList>, type: Object as PropType<AreaList>,
default: () => ({}), default: () => ({}),
@ -59,10 +66,6 @@ const props = extend({}, pickerProps, {
type: Function as PropType<(code: string) => boolean>, type: Function as PropType<(code: string) => boolean>,
default: isOverseaCode, default: isOverseaCode,
}, },
columnsPlaceholder: {
type: Array as PropType<string[]>,
default: () => [],
},
}); });
export type AreaProps = ExtractPropTypes<typeof props>; export type AreaProps = ExtractPropTypes<typeof props>;

View File

@ -76,6 +76,7 @@ const props = {
allowSameDay: Boolean, allowSameDay: Boolean,
showSubtitle: truthProp, showSubtitle: truthProp,
closeOnPopstate: truthProp, closeOnPopstate: truthProp,
showRangePrompt: truthProp,
confirmDisabledText: String, confirmDisabledText: String,
closeOnClickOverlay: truthProp, closeOnClickOverlay: truthProp,
safeAreaInsetBottom: truthProp, safeAreaInsetBottom: truthProp,
@ -97,10 +98,6 @@ const props = {
default: 0, default: 0,
validator: (val: number) => val >= 0 && val <= 6, validator: (val: number) => val >= 0 && val <= 6,
}, },
showRangePrompt: {
type: Boolean,
default: true,
},
}; };
export type CalendarProps = ExtractPropTypes<typeof props>; export type CalendarProps = ExtractPropTypes<typeof props>;

View File

@ -1,5 +1,5 @@
import { computed, CSSProperties, PropType, defineComponent } from 'vue'; import { computed, CSSProperties, PropType, defineComponent } from 'vue';
import { createNamespace } from '../utils'; import { makeNumberProp, createNamespace, makeRequiredProp } from '../utils';
import { bem } from './utils'; import { bem } from './utils';
import type { CalendarDayItem } from './types'; import type { CalendarDayItem } from './types';
@ -9,17 +9,11 @@ export default defineComponent({
name, name,
props: { props: {
item: makeRequiredProp<PropType<CalendarDayItem>>(Object),
color: String, color: String,
index: Number, index: Number,
offset: makeNumberProp(0),
rowHeight: String, rowHeight: String,
offset: {
type: Number,
default: 0,
},
item: {
type: Object as PropType<CalendarDayItem>,
required: true,
},
}, },
emits: ['click'], emits: ['click'],

View File

@ -13,6 +13,7 @@ import {
numericProp, numericProp,
setScrollTop, setScrollTop,
createNamespace, createNamespace,
makeRequiredProp,
} from '../utils'; } from '../utils';
import { getMonthEndDay } from '../datetime-picker/utils'; import { getMonthEndDay } from '../datetime-picker/utils';
import { import {
@ -38,8 +39,11 @@ import type { CalendarType, CalendarDayItem, CalendarDayType } from './types';
const [name] = createNamespace('calendar-month'); const [name] = createNamespace('calendar-month');
const props = { const props = {
date: makeRequiredProp(Date),
type: String as PropType<CalendarType>, type: String as PropType<CalendarType>,
color: String, color: String,
minDate: makeRequiredProp(Date),
maxDate: makeRequiredProp(Date),
showMark: Boolean, showMark: Boolean,
rowHeight: numericProp, rowHeight: numericProp,
formatter: Function as PropType<(item: CalendarDayItem) => CalendarDayItem>, formatter: Function as PropType<(item: CalendarDayItem) => CalendarDayItem>,
@ -49,18 +53,6 @@ const props = {
showSubtitle: Boolean, showSubtitle: Boolean,
showMonthTitle: Boolean, showMonthTitle: Boolean,
firstDayOfWeek: Number, firstDayOfWeek: Number,
date: {
type: Date,
required: true as const,
},
minDate: {
type: Date,
required: true as const,
},
maxDate: {
type: Date,
required: true as const,
},
}; };
export type CalendarMonthProps = ExtractPropTypes<typeof props>; export type CalendarMonthProps = ExtractPropTypes<typeof props>;

View File

@ -3,6 +3,7 @@ import {
extend, extend,
truthProp, truthProp,
numericProp, numericProp,
makeArrayProp,
makeStringProp, makeStringProp,
createNamespace, createNamespace,
} from '../utils'; } from '../utils';
@ -25,7 +26,7 @@ export type CascaderOption = {
children?: CascaderOption[]; children?: CascaderOption[];
className?: unknown; className?: unknown;
// for custom filed names // for custom filed names
[key: string]: any; [key: PropertyKey]: any;
}; };
type CascaderTab = { type CascaderTab = {
@ -44,6 +45,7 @@ export default defineComponent({
props: { props: {
title: String, title: String,
options: makeArrayProp<CascaderOption>(),
closeable: truthProp, closeable: truthProp,
swipeable: truthProp, swipeable: truthProp,
closeIcon: makeStringProp('cross'), closeIcon: makeStringProp('cross'),
@ -51,10 +53,6 @@ export default defineComponent({
fieldNames: Object as PropType<CascaderFieldNames>, fieldNames: Object as PropType<CascaderFieldNames>,
placeholder: String, placeholder: String,
activeColor: String, activeColor: String,
options: {
type: Array as PropType<CascaderOption[]>,
default: () => [],
},
}, },
emits: ['close', 'change', 'finish', 'update:modelValue', 'click-tab'], emits: ['close', 'change', 'finish', 'update:modelValue', 'click-tab'],

View File

@ -7,7 +7,7 @@ import {
} from 'vue'; } from 'vue';
// Utils // Utils
import { numericProp, createNamespace } from '../utils'; import { numericProp, createNamespace, makeArrayProp } from '../utils';
// Composables // Composables
import { useChildren, useCustomFieldValue } from '@vant/use'; import { useChildren, useCustomFieldValue } from '@vant/use';
@ -26,13 +26,10 @@ const [name, bem] = createNamespace('checkbox-group');
const props = { const props = {
max: numericProp, max: numericProp,
disabled: Boolean, disabled: Boolean,
direction: String as PropType<CheckerDirection>,
iconSize: numericProp, iconSize: numericProp,
direction: String as PropType<CheckerDirection>,
modelValue: makeArrayProp<unknown>(),
checkedColor: String, checkedColor: String,
modelValue: {
type: Array as PropType<unknown[]>,
default: () => [],
},
}; };
export type CheckboxGroupProps = ExtractPropTypes<typeof props>; export type CheckboxGroupProps = ExtractPropTypes<typeof props>;

View File

@ -6,6 +6,7 @@ import {
numericProp, numericProp,
unknownProp, unknownProp,
makeStringProp, makeStringProp,
makeRequiredProp,
} from '../utils'; } from '../utils';
import { Icon } from '../icon'; import { Icon } from '../icon';
@ -34,14 +35,11 @@ export const checkerProps = {
export default defineComponent({ export default defineComponent({
props: extend({}, checkerProps, { props: extend({}, checkerProps, {
bem: makeRequiredProp(Function),
role: String, role: String,
parent: Object as PropType<CheckerParent | null>, parent: Object as PropType<CheckerParent | null>,
checked: Boolean, checked: Boolean,
bindGroup: truthProp, bindGroup: truthProp,
bem: {
type: Function,
required: true as const,
},
}), }),
emits: ['click', 'toggle'], emits: ['click', 'toggle'],

View File

@ -6,6 +6,7 @@ import {
numericProp, numericProp,
getSizeStyle, getSizeStyle,
makeStringProp, makeStringProp,
makeNumberProp,
makeNumericProp, makeNumericProp,
createNamespace, createNamespace,
} from '../utils'; } from '../utils';
@ -37,13 +38,10 @@ export default defineComponent({
color: [String, Object] as PropType<string | Record<string, string>>, color: [String, Object] as PropType<string | Record<string, string>>,
clockwise: truthProp, clockwise: truthProp,
layerColor: String, layerColor: String,
currentRate: makeNumberProp(0),
strokeWidth: makeNumericProp(40), strokeWidth: makeNumericProp(40),
strokeLinecap: String as PropType<CanvasLineCap>, strokeLinecap: String as PropType<CanvasLineCap>,
startPosition: makeStringProp<CircleStartPosition>('top'), startPosition: makeStringProp<CircleStartPosition>('top'),
currentRate: {
type: Number,
default: 0,
},
}, },
emits: ['update:currentRate'], emits: ['update:currentRate'],

View File

@ -1,9 +1,10 @@
import { PropType, defineComponent } from 'vue'; import { defineComponent } from 'vue';
// Utils // Utils
import { import {
isDef, isDef,
truthProp, truthProp,
makeArrayProp,
makeStringProp, makeStringProp,
makeNumericProp, makeNumericProp,
createNamespace, createNamespace,
@ -46,12 +47,9 @@ export default defineComponent({
title: String, title: String,
border: truthProp, border: truthProp,
editable: truthProp, editable: truthProp,
coupons: makeArrayProp<CouponInfo>(),
currency: makeStringProp('¥'), currency: makeStringProp('¥'),
chosenCoupon: makeNumericProp(-1), chosenCoupon: makeNumericProp(-1),
coupons: {
type: Array as PropType<CouponInfo[]>,
default: () => [],
},
}, },
setup(props) { setup(props) {

View File

@ -3,13 +3,18 @@ import {
computed, computed,
nextTick, nextTick,
reactive, reactive,
PropType,
onMounted, onMounted,
defineComponent, defineComponent,
} from 'vue'; } from 'vue';
// Utils // Utils
import { truthProp, makeStringProp, createNamespace } from '../utils'; import {
truthProp,
makeArrayProp,
makeStringProp,
makeNumberProp,
createNamespace,
} from '../utils';
// Composables // Composables
import { useRefs } from '../composables/use-refs'; import { useRefs } from '../composables/use-refs';
@ -29,38 +34,23 @@ export default defineComponent({
props: { props: {
code: makeStringProp(''), code: makeStringProp(''),
coupons: makeArrayProp<CouponInfo>(),
currency: makeStringProp('¥'), currency: makeStringProp('¥'),
showCount: truthProp, showCount: truthProp,
emptyImage: makeStringProp(EMPTY_IMAGE), emptyImage: makeStringProp(EMPTY_IMAGE),
chosenCoupon: makeNumberProp(-1),
enabledTitle: String, enabledTitle: String,
disabledTitle: String, disabledTitle: String,
disabledCoupons: makeArrayProp<CouponInfo>(),
showExchangeBar: truthProp, showExchangeBar: truthProp,
showCloseButton: truthProp, showCloseButton: truthProp,
closeButtonText: String, closeButtonText: String,
inputPlaceholder: String, inputPlaceholder: String,
exchangeMinLength: makeNumberProp(1),
exchangeButtonText: String, exchangeButtonText: String,
displayedCouponIndex: makeNumberProp(-1),
exchangeButtonLoading: Boolean, exchangeButtonLoading: Boolean,
exchangeButtonDisabled: Boolean, exchangeButtonDisabled: Boolean,
exchangeMinLength: {
type: Number,
default: 1,
},
chosenCoupon: {
type: Number,
default: -1,
},
coupons: {
type: Array as PropType<CouponInfo[]>,
default: () => [],
},
disabledCoupons: {
type: Array as PropType<CouponInfo[]>,
default: () => [],
},
displayedCouponIndex: {
type: Number,
default: -1,
},
}, },
emits: ['change', 'exchange', 'update:code'], emits: ['change', 'exchange', 'update:code'],

View File

@ -1,5 +1,10 @@
import { computed, PropType, defineComponent } from 'vue'; import { computed, PropType, defineComponent } from 'vue';
import { padZero, makeStringProp, createNamespace } from '../utils'; import {
padZero,
makeStringProp,
createNamespace,
makeRequiredProp,
} from '../utils';
import { Checkbox } from '../checkbox'; import { Checkbox } from '../checkbox';
export type CouponInfo = { export type CouponInfo = {
@ -38,12 +43,9 @@ export default defineComponent({
props: { props: {
chosen: Boolean, chosen: Boolean,
coupon: makeRequiredProp<PropType<CouponInfo>>(Object),
disabled: Boolean, disabled: Boolean,
currency: makeStringProp('¥'), currency: makeStringProp('¥'),
coupon: {
type: Object as PropType<CouponInfo>,
required: true,
},
}, },
setup(props) { setup(props) {

View File

@ -14,6 +14,7 @@ import {
unknownProp, unknownProp,
getZIndexStyle, getZIndexStyle,
createNamespace, createNamespace,
makeArrayProp,
} from '../utils'; } from '../utils';
import { DROPDOWN_KEY } from '../dropdown-menu/DropdownMenu'; import { DROPDOWN_KEY } from '../dropdown-menu/DropdownMenu';
@ -33,15 +34,12 @@ const [name, bem] = createNamespace('dropdown-item');
const props = { const props = {
title: String, title: String,
options: makeArrayProp<DropdownItemOption>(),
disabled: Boolean, disabled: Boolean,
teleport: [String, Object] as PropType<TeleportProps['to']>, teleport: [String, Object] as PropType<TeleportProps['to']>,
lazyRender: truthProp, lazyRender: truthProp,
modelValue: unknownProp, modelValue: unknownProp,
titleClass: unknownProp, titleClass: unknownProp,
options: {
type: Array as PropType<DropdownItemOption[]>,
default: () => [],
},
}; };
export type DropdownItemProps = ExtractPropTypes<typeof props>; export type DropdownItemProps = ExtractPropTypes<typeof props>;

View File

@ -16,6 +16,7 @@ import {
truthProp, truthProp,
unknownProp, unknownProp,
Interceptor, Interceptor,
makeArrayProp,
makeStringProp, makeStringProp,
makeNumericProp, makeNumericProp,
callInterceptor, callInterceptor,
@ -40,6 +41,7 @@ const [name, bem] = createNamespace('image-preview');
const props = { const props = {
show: Boolean, show: Boolean,
loop: truthProp, loop: truthProp,
images: makeArrayProp<string>(),
minZoom: makeNumericProp(1 / 3), minZoom: makeNumericProp(1 / 3),
maxZoom: makeNumericProp(3), maxZoom: makeNumericProp(3),
overlay: truthProp, overlay: truthProp,
@ -55,10 +57,6 @@ const props = {
showIndicators: Boolean, showIndicators: Boolean,
closeOnPopstate: truthProp, closeOnPopstate: truthProp,
closeIconPosition: makeStringProp<PopupCloseIconPosition>('top-right'), closeIconPosition: makeStringProp<PopupCloseIconPosition>('top-right'),
images: {
type: Array as PropType<string[]>,
default: () => [],
},
}; };
export type ImagePreviewProps = ExtractPropTypes<typeof props>; export type ImagePreviewProps = ExtractPropTypes<typeof props>;

View File

@ -1,7 +1,13 @@
import { watch, computed, reactive, CSSProperties, defineComponent } from 'vue'; import { watch, computed, reactive, CSSProperties, defineComponent } from 'vue';
// Utils // Utils
import { clamp, preventDefault, numericProp, createNamespace } from '../utils'; import {
clamp,
numericProp,
preventDefault,
createNamespace,
makeRequiredProp,
} from '../utils';
// Composables // Composables
import { useTouch } from '../composables/use-touch'; import { useTouch } from '../composables/use-touch';
@ -24,22 +30,10 @@ export default defineComponent({
src: String, src: String,
show: Boolean, show: Boolean,
active: Number, active: Number,
minZoom: { minZoom: makeRequiredProp(numericProp),
type: numericProp, maxZoom: makeRequiredProp(numericProp),
required: true, rootWidth: makeRequiredProp(Number),
}, rootHeight: makeRequiredProp(Number),
maxZoom: {
type: numericProp,
required: true,
},
rootWidth: {
type: Number,
required: true,
},
rootHeight: {
type: Number,
required: true,
},
}, },
emits: ['scale', 'close'], emits: ['scale', 'close'],

View File

@ -21,6 +21,7 @@ import {
numericProp, numericProp,
getScrollTop, getScrollTop,
preventDefault, preventDefault,
makeNumberProp,
createNamespace, createNamespace,
getRootScrollTop, getRootScrollTop,
setRootScrollTop, setRootScrollTop,
@ -55,10 +56,7 @@ const props = {
zIndex: numericProp, zIndex: numericProp,
teleport: [String, Object] as PropType<TeleportProps['to']>, teleport: [String, Object] as PropType<TeleportProps['to']>,
highlightColor: String, highlightColor: String,
stickyOffsetTop: { stickyOffsetTop: makeNumberProp(0),
type: Number,
default: 0,
},
indexList: { indexList: {
type: Array as PropType<string[]>, type: Array as PropType<string[]>,
default: genAlphabet, default: genAlphabet,

View File

@ -2,6 +2,7 @@ import { computed, watch, defineComponent } from 'vue';
import { import {
BORDER, BORDER,
makeStringProp, makeStringProp,
makeNumberProp,
makeNumericProp, makeNumericProp,
createNamespace, createNamespace,
} from '../utils'; } from '../utils';
@ -30,14 +31,11 @@ export default defineComponent({
prevText: String, prevText: String,
nextText: String, nextText: String,
pageCount: makeNumericProp(0), pageCount: makeNumericProp(0),
modelValue: makeNumberProp(0),
totalItems: makeNumericProp(0), totalItems: makeNumericProp(0),
showPageSize: makeNumericProp(5), showPageSize: makeNumericProp(5),
itemsPerPage: makeNumericProp(10), itemsPerPage: makeNumericProp(10),
forceEllipses: Boolean, forceEllipses: Boolean,
modelValue: {
type: Number,
default: 0,
},
}, },
emits: ['change', 'update:modelValue'], emits: ['change', 'update:modelValue'],

View File

@ -12,10 +12,11 @@ import {
extend, extend,
unitToPx, unitToPx,
truthProp, truthProp,
makeArrayProp,
preventDefault, preventDefault,
makeStringProp, makeStringProp,
createNamespace,
makeNumericProp, makeNumericProp,
createNamespace,
BORDER_UNSET_TOP_BOTTOM, BORDER_UNSET_TOP_BOTTOM,
} from '../utils'; } from '../utils';
@ -58,16 +59,13 @@ export default defineComponent({
name, name,
props: extend({}, pickerProps, { props: extend({}, pickerProps, {
columns: makeArrayProp<PickerOption | PickerColumn>(),
// @deprecated // @deprecated
// should be removed in next major version // should be removed in next major version
valueKey: String, valueKey: String,
defaultIndex: makeNumericProp(0), defaultIndex: makeNumericProp(0),
toolbarPosition: makeStringProp<PickerToolbarPosition>('top'), toolbarPosition: makeStringProp<PickerToolbarPosition>('top'),
columnsFieldNames: Object as PropType<PickerFieldNames>, columnsFieldNames: Object as PropType<PickerFieldNames>,
columns: {
type: Array as PropType<PickerOption[] | PickerColumn[]>,
default: () => [],
},
}), }),
emits: ['confirm', 'cancel', 'change'], emits: ['confirm', 'cancel', 'change'],

View File

@ -1,4 +1,4 @@
import { ref, watch, reactive, PropType, defineComponent } from 'vue'; import { ref, watch, reactive, defineComponent } from 'vue';
// Utils // Utils
import { deepClone } from '../utils/deep-clone'; import { deepClone } from '../utils/deep-clone';
@ -7,8 +7,11 @@ import {
isObject, isObject,
unknownProp, unknownProp,
numericProp, numericProp,
makeArrayProp,
makeNumberProp,
preventDefault, preventDefault,
createNamespace, createNamespace,
makeRequiredProp,
} from '../utils'; } from '../utils';
// Composables // Composables
@ -44,33 +47,15 @@ export default defineComponent({
name, name,
props: { props: {
textKey: makeRequiredProp(String),
readonly: Boolean, readonly: Boolean,
allowHtml: Boolean, allowHtml: Boolean,
className: unknownProp, className: unknownProp,
textKey: { itemHeight: makeRequiredProp(Number),
type: String, defaultIndex: makeNumberProp(0),
required: true, swipeDuration: makeRequiredProp(numericProp),
}, initialOptions: makeArrayProp<PickerOption>(),
itemHeight: { visibleItemCount: makeRequiredProp(numericProp),
type: Number,
required: true,
},
swipeDuration: {
type: numericProp,
required: true,
},
visibleItemCount: {
type: numericProp,
required: true,
},
defaultIndex: {
type: Number,
default: 0,
},
initialOptions: {
type: Array as PropType<PickerOption[]>,
default: () => [],
},
}, },
emits: ['change'], emits: ['change'],

View File

@ -14,7 +14,7 @@ export type PickerObjectOption = {
text?: string | number; text?: string | number;
disabled?: boolean; disabled?: boolean;
// for custom filed names // for custom filed names
[key: string]: any; [key: PropertyKey]: any;
}; };
export type PickerOption = string | number | PickerObjectOption; export type PickerOption = string | number | PickerObjectOption;
@ -25,7 +25,7 @@ export type PickerObjectColumn = {
className?: unknown; className?: unknown;
defaultIndex?: number; defaultIndex?: number;
// for custom filed names // for custom filed names
[key: string]: any; [key: PropertyKey]: any;
}; };
export type PickerColumn = PickerOption[] | PickerObjectColumn; export type PickerColumn = PickerOption[] | PickerObjectColumn;

View File

@ -22,6 +22,7 @@ import {
makeStringProp, makeStringProp,
createNamespace, createNamespace,
ComponentInstance, ComponentInstance,
makeArrayProp,
} from '../utils'; } from '../utils';
// Composables // Composables
@ -75,8 +76,10 @@ export default defineComponent({
show: Boolean, show: Boolean,
theme: makeStringProp<PopoverTheme>('light'), theme: makeStringProp<PopoverTheme>('light'),
overlay: Boolean, overlay: Boolean,
actions: makeArrayProp<PopoverAction>(),
trigger: makeStringProp<PopoverTrigger>('click'), trigger: makeStringProp<PopoverTrigger>('click'),
duration: numericProp, duration: numericProp,
showArrow: truthProp,
placement: makeStringProp<PopoverPlacement>('bottom'), placement: makeStringProp<PopoverPlacement>('bottom'),
iconPrefix: String, iconPrefix: String,
overlayClass: unknownProp, overlayClass: unknownProp,
@ -88,18 +91,10 @@ export default defineComponent({
type: Array as unknown as PropType<[number, number]>, type: Array as unknown as PropType<[number, number]>,
default: () => [0, 8], default: () => [0, 8],
}, },
actions: {
type: Array as PropType<PopoverAction[]>,
default: () => [],
},
teleport: { teleport: {
type: [String, Object] as PropType<TeleportProps['to']>, type: [String, Object] as PropType<TeleportProps['to']>,
default: 'body', default: 'body',
}, },
showArrow: {
type: Boolean,
default: true,
},
}, },
emits: ['select', 'touchstart', 'update:show'], emits: ['select', 'touchstart', 'update:show'],

View File

@ -7,6 +7,7 @@ import {
numericProp, numericProp,
preventDefault, preventDefault,
makeStringProp, makeStringProp,
makeNumberProp,
makeNumericProp, makeNumericProp,
createNamespace, createNamespace,
} from '../utils'; } from '../utils';
@ -69,11 +70,8 @@ export default defineComponent({
voidColor: String, voidColor: String,
touchable: truthProp, touchable: truthProp,
iconPrefix: String, iconPrefix: String,
modelValue: makeNumberProp(0),
disabledColor: String, disabledColor: String,
modelValue: {
type: Number,
default: 0,
},
}, },
emits: ['change', 'update:modelValue'], emits: ['change', 'update:modelValue'],

View File

@ -1,7 +1,13 @@
import { PropType, defineComponent } from 'vue'; import { defineComponent } from 'vue';
// Utils // Utils
import { truthProp, createNamespace, extend, pick } from '../utils'; import {
pick,
extend,
truthProp,
makeArrayProp,
createNamespace,
} from '../utils';
import { popupSharedProps, popupSharedPropKeys } from '../popup/shared'; import { popupSharedProps, popupSharedPropKeys } from '../popup/shared';
// Components // Components
@ -47,14 +53,11 @@ export default defineComponent({
props: extend({}, popupSharedProps, { props: extend({}, popupSharedProps, {
title: String, title: String,
options: makeArrayProp<ShareSheetOption | ShareSheetOption[]>(),
cancelText: String, cancelText: String,
description: String, description: String,
closeOnPopstate: truthProp, closeOnPopstate: truthProp,
safeAreaInsetBottom: truthProp, safeAreaInsetBottom: truthProp,
options: {
type: Array as PropType<ShareSheetOptions>,
default: () => [],
},
}), }),
emits: ['cancel', 'select', 'update:show'], emits: ['cancel', 'select', 'update:show'],

View File

@ -49,8 +49,8 @@ export default defineComponent({
setup(props, { emit, slots }) { setup(props, { emit, slots }) {
let buttonIndex: 0 | 1; let buttonIndex: 0 | 1;
let current: SliderValue;
let startValue: SliderValue; let startValue: SliderValue;
let currentValue: SliderValue;
const root = ref<HTMLElement>(); const root = ref<HTMLElement>();
const dragStatus = ref<'start' | 'dragging' | ''>(); const dragStatus = ref<'start' | 'dragging' | ''>();
@ -193,12 +193,12 @@ export default defineComponent({
} }
touch.start(event); touch.start(event);
currentValue = props.modelValue; current = props.modelValue;
if (isRange(currentValue)) { if (isRange(current)) {
startValue = currentValue.map(format) as NumberRange; startValue = current.map(format) as NumberRange;
} else { } else {
startValue = format(currentValue); startValue = format(current);
} }
dragStatus.value = 'start'; dragStatus.value = 'start';
@ -228,11 +228,11 @@ export default defineComponent({
if (isRange(startValue)) { if (isRange(startValue)) {
const index = props.reverse ? 1 - buttonIndex : buttonIndex; const index = props.reverse ? 1 - buttonIndex : buttonIndex;
(currentValue as NumberRange)[index] = startValue[index] + diff; (current as NumberRange)[index] = startValue[index] + diff;
} else { } else {
currentValue = startValue + diff; current = startValue + diff;
} }
updateValue(currentValue); updateValue(current);
}; };
const onTouchEnd = (event: TouchEvent) => { const onTouchEnd = (event: TouchEvent) => {
@ -241,7 +241,7 @@ export default defineComponent({
} }
if (dragStatus.value === 'dragging') { if (dragStatus.value === 'dragging') {
updateValue(currentValue, true); updateValue(current, true);
emit('drag-end', event); emit('drag-end', event);
} }
@ -274,7 +274,7 @@ export default defineComponent({
}; };
const renderButton = (index?: 0 | 1) => { const renderButton = (index?: 0 | 1) => {
const currentValue = const current =
typeof index === 'number' typeof index === 'number'
? (props.modelValue as NumberRange)[index] ? (props.modelValue as NumberRange)[index]
: (props.modelValue as number); : (props.modelValue as number);
@ -285,7 +285,7 @@ export default defineComponent({
class={getButtonClassName(index)} class={getButtonClassName(index)}
tabindex={props.disabled || props.readonly ? -1 : 0} tabindex={props.disabled || props.readonly ? -1 : 0}
aria-valuemin={+props.min} aria-valuemin={+props.min}
aria-valuenow={currentValue} aria-valuenow={current}
aria-valuemax={+props.max} aria-valuemax={+props.max}
aria-orientation={props.vertical ? 'vertical' : 'horizontal'} aria-orientation={props.vertical ? 'vertical' : 'horizontal'}
onTouchstart={(event) => { onTouchstart={(event) => {
@ -300,7 +300,7 @@ export default defineComponent({
onTouchcancel={onTouchEnd} onTouchcancel={onTouchEnd}
onClick={stopPropagation} onClick={stopPropagation}
> >
{renderButtonContent(currentValue, index)} {renderButtonContent(current, index)}
</div> </div>
); );
}; };

View File

@ -1,5 +1,5 @@
import { ref, watch, onMounted, defineComponent } from 'vue'; import { ref, watch, onMounted, defineComponent } from 'vue';
import { numericProp, createNamespace } from '../utils'; import { numericProp, makeRequiredProp, createNamespace } from '../utils';
import { Swipe, SwipeInstance } from '../swipe'; import { Swipe, SwipeInstance } from '../swipe';
const [name, bem] = createNamespace('tabs'); const [name, bem] = createNamespace('tabs');
@ -8,22 +8,13 @@ export default defineComponent({
name, name,
props: { props: {
count: makeRequiredProp(Number),
inited: Boolean, inited: Boolean,
animated: Boolean, animated: Boolean,
duration: makeRequiredProp(numericProp),
swipeable: Boolean, swipeable: Boolean,
lazyRender: Boolean, lazyRender: Boolean,
count: { currentIndex: makeRequiredProp(Number),
type: Number,
required: true,
},
duration: {
type: numericProp,
required: true,
},
currentIndex: {
type: Number,
required: true,
},
}, },
emits: ['change'], emits: ['change'],

View File

@ -13,6 +13,7 @@ import {
unknownProp, unknownProp,
numericProp, numericProp,
makeStringProp, makeStringProp,
makeNumberProp,
createNamespace, createNamespace,
} from '../utils'; } from '../utils';
import { lockClick } from './lock-click'; import { lockClick } from './lock-click';
@ -37,6 +38,7 @@ export default defineComponent({
overlay: Boolean, overlay: Boolean,
message: numericProp, message: numericProp,
iconSize: numericProp, iconSize: numericProp,
duration: makeNumberProp(2000),
position: makeStringProp<ToastPosition>('middle'), position: makeStringProp<ToastPosition>('middle'),
className: unknownProp, className: unknownProp,
iconPrefix: String, iconPrefix: String,
@ -47,10 +49,6 @@ export default defineComponent({
overlayStyle: Object as PropType<CSSProperties>, overlayStyle: Object as PropType<CSSProperties>,
closeOnClick: Boolean, closeOnClick: Boolean,
closeOnClickOverlay: Boolean, closeOnClickOverlay: Boolean,
duration: {
type: Number,
default: 2000,
},
}, },
emits: ['update:show'], emits: ['update:show'],

View File

@ -3,6 +3,7 @@ import { PropType, defineComponent } from 'vue';
// Utils // Utils
import { import {
addUnit, addUnit,
makeArrayProp,
makeStringProp, makeStringProp,
makeNumericProp, makeNumericProp,
createNamespace, createNamespace,
@ -35,13 +36,10 @@ export default defineComponent({
props: { props: {
max: makeNumericProp(Infinity), max: makeNumericProp(Infinity),
items: makeArrayProp<TreeSelectItem>(),
height: makeNumericProp(300), height: makeNumericProp(300),
selectedIcon: makeStringProp('success'), selectedIcon: makeStringProp('success'),
mainActiveIndex: makeNumericProp(0), mainActiveIndex: makeNumericProp(0),
items: {
type: Array as PropType<TreeSelectItem[]>,
default: () => [],
},
activeId: { activeId: {
type: [Number, String, Array] as PropType< type: [Number, String, Array] as PropType<
number | string | Array<number | string> number | string | Array<number | string>

View File

@ -15,6 +15,7 @@ import {
numericProp, numericProp,
Interceptor, Interceptor,
getSizeStyle, getSizeStyle,
makeArrayProp,
makeStringProp, makeStringProp,
makeNumericProp, makeNumericProp,
ComponentInstance, ComponentInstance,
@ -65,16 +66,13 @@ const props = {
deletable: truthProp, deletable: truthProp,
afterRead: Function as PropType<UploaderAfterRead>, afterRead: Function as PropType<UploaderAfterRead>,
showUpload: truthProp, showUpload: truthProp,
modelValue: makeArrayProp<UploaderFileListItem>(),
beforeRead: Function as PropType<UploaderBeforeRead>, beforeRead: Function as PropType<UploaderBeforeRead>,
beforeDelete: Function as PropType<Interceptor>, beforeDelete: Function as PropType<Interceptor>,
previewSize: numericProp, previewSize: numericProp,
previewImage: truthProp, previewImage: truthProp,
previewOptions: Object as PropType<ImagePreviewOptions>, previewOptions: Object as PropType<ImagePreviewOptions>,
previewFullImage: truthProp, previewFullImage: truthProp,
modelValue: {
type: Array as PropType<UploaderFileListItem[]>,
default: () => [],
},
maxSize: { maxSize: {
type: [Number, String, Function] as PropType<UploaderMaxSize>, type: [Number, String, Function] as PropType<UploaderMaxSize>,
default: Infinity, default: Infinity,

View File

@ -9,6 +9,7 @@ import {
numericProp, numericProp,
getSizeStyle, getSizeStyle,
callInterceptor, callInterceptor,
makeRequiredProp,
} from '../utils'; } from '../utils';
// Components // Components
@ -22,16 +23,13 @@ import type { UploaderFileListItem } from './types';
export default defineComponent({ export default defineComponent({
props: { props: {
name: numericProp, name: numericProp,
item: makeRequiredProp<PropType<UploaderFileListItem>>(Object),
index: Number, index: Number,
imageFit: String as PropType<ImageFit>, imageFit: String as PropType<ImageFit>,
lazyLoad: Boolean, lazyLoad: Boolean,
deletable: Boolean, deletable: Boolean,
previewSize: numericProp, previewSize: numericProp,
beforeDelete: Function as PropType<Interceptor>, beforeDelete: Function as PropType<Interceptor>,
item: {
type: Object as PropType<UploaderFileListItem>,
required: true,
},
}, },
emits: ['delete', 'preview'], emits: ['delete', 'preview'],

View File

@ -1,4 +1,4 @@
import { PropType, ComponentPublicInstance } from 'vue'; import type { ComponentPublicInstance } from 'vue';
export function noop() {} export function noop() {}
@ -6,23 +6,6 @@ export const extend = Object.assign;
export const inBrowser = typeof window !== 'undefined'; export const inBrowser = typeof window !== 'undefined';
// propType helpers
// help us to write less code, reduce bundle size
export const unknownProp = null as unknown as PropType<unknown>;
export const numericProp = [Number, String];
export const truthProp = {
type: Boolean,
default: true as const,
};
export const makeNumericProp = <T>(defaultVal: T) => ({
type: numericProp,
default: defaultVal,
});
export const makeStringProp = <T>(defaultVal: T) => ({
type: String as unknown as PropType<T>,
default: defaultVal,
});
// eslint-disable-next-line // eslint-disable-next-line
export type ComponentInstance = ComponentPublicInstance<{}, any>; export type ComponentInstance = ComponentPublicInstance<{}, any>;

View File

@ -1,4 +1,5 @@
export * from './basic'; export * from './basic';
export * from './props';
export * from './dom'; export * from './dom';
export * from './create'; export * from './create';
export * from './format'; export * from './format';

View File

@ -0,0 +1,39 @@
/**
* prop type helpers
* help us to write less code and reduce bundle size
*/
import type { PropType } from 'vue';
export const unknownProp = null as unknown as PropType<unknown>;
export const numericProp = [Number, String];
export const truthProp = {
type: Boolean,
default: true as const,
};
export const makeRequiredProp = <T>(type: T) => ({
type,
required: true as const,
});
export const makeArrayProp = <T>() => ({
type: Array as PropType<T[]>,
default: () => [],
});
export const makeNumberProp = <T>(defaultVal: T) => ({
type: Number,
default: defaultVal,
});
export const makeNumericProp = <T>(defaultVal: T) => ({
type: numericProp,
default: defaultVal,
});
export const makeStringProp = <T>(defaultVal: T) => ({
type: String as unknown as PropType<T>,
default: defaultVal,
});