diff --git a/packages/oruga/src/components/autocomplete/Autocomplete.vue b/packages/oruga/src/components/autocomplete/Autocomplete.vue index 829dd228b..d2ba8efdf 100644 --- a/packages/oruga/src/components/autocomplete/Autocomplete.vue +++ b/packages/oruga/src/components/autocomplete/Autocomplete.vue @@ -66,6 +66,8 @@ defineOptions({ inheritAttrs: false, }); +type ModelValue = AutocompleteProps["modelValue"]; + const props = withDefaults(defineProps>(), { override: undefined, modelValue: undefined, @@ -111,8 +113,6 @@ const props = withDefaults(defineProps>(), { inputClasses: () => getOption("autocomplete.inputClasses", {}), }); -type ModelValue = AutocompleteProps["modelValue"]; - const emits = defineEmits<{ /** * modelValue prop two-way binding diff --git a/packages/oruga/src/components/datepicker/Datepicker.vue b/packages/oruga/src/components/datepicker/Datepicker.vue index ba2c74c4b..7dacd27c1 100644 --- a/packages/oruga/src/components/datepicker/Datepicker.vue +++ b/packages/oruga/src/components/datepicker/Datepicker.vue @@ -35,6 +35,8 @@ defineOptions({ configField: "datepicker", }); +type ModelValue = DatepickerProps["modelValue"]; + const props = withDefaults( defineProps>(), { @@ -100,8 +102,6 @@ const props = withDefaults( }, ); -type ModelValue = DatepickerProps["modelValue"]; - const emits = defineEmits<{ /** * modelValue prop two-way binding diff --git a/packages/oruga/src/components/dropdown/Dropdown.vue b/packages/oruga/src/components/dropdown/Dropdown.vue index a948c5aa5..3a76019c4 100644 --- a/packages/oruga/src/components/dropdown/Dropdown.vue +++ b/packages/oruga/src/components/dropdown/Dropdown.vue @@ -49,6 +49,8 @@ defineOptions({ configField: "dropdown", }); +type ModelValue = DropdownProps["modelValue"]; + const props = withDefaults(defineProps>(), { override: undefined, modelValue: undefined, @@ -81,8 +83,6 @@ const props = withDefaults(defineProps>(), { teleport: () => getOption("dropdown.teleport", false), }); -type ModelValue = DropdownProps["modelValue"]; - const emits = defineEmits<{ /** * modelValue prop two-way binding diff --git a/packages/oruga/src/components/input/Input.vue b/packages/oruga/src/components/input/Input.vue index 9ac6cdf71..7c4ba4a78 100644 --- a/packages/oruga/src/components/input/Input.vue +++ b/packages/oruga/src/components/input/Input.vue @@ -32,6 +32,8 @@ defineOptions({ inheritAttrs: false, }); +type ModelValue = InputProps["modelValue"]; + const props = withDefaults(defineProps>(), { override: undefined, modelValue: undefined, @@ -63,8 +65,6 @@ const props = withDefaults(defineProps>(), { customValidity: "", }); -type ModelValue = typeof props.modelValue; - const emits = defineEmits<{ /** * modelValue prop two-way binding diff --git a/packages/oruga/src/components/select/Select.vue b/packages/oruga/src/components/select/Select.vue index d4726f247..a33724314 100644 --- a/packages/oruga/src/components/select/Select.vue +++ b/packages/oruga/src/components/select/Select.vue @@ -34,6 +34,8 @@ defineOptions({ inheritAttrs: false, }); +type ModelValue = SelectProps["modelValue"]; + const props = withDefaults(defineProps>(), { override: undefined, modelValue: undefined, @@ -60,8 +62,6 @@ const props = withDefaults(defineProps>(), { statusIcon: () => getOption("statusIcon", true), }); -type ModelValue = typeof props.modelValue; - const emits = defineEmits<{ /** * modelValue prop two-way binding diff --git a/packages/oruga/src/components/slider/Slider.vue b/packages/oruga/src/components/slider/Slider.vue index 3166dc6af..311af3a44 100644 --- a/packages/oruga/src/components/slider/Slider.vue +++ b/packages/oruga/src/components/slider/Slider.vue @@ -23,6 +23,8 @@ defineOptions({ configField: "slider", }); +type ModelValue = SliderProps["modelValue"]; + const props = withDefaults(defineProps>(), { override: undefined, modelValue: undefined, @@ -47,8 +49,6 @@ const props = withDefaults(defineProps>(), { ariaLabel: () => getOption("slider.ariaLabel"), }); -type ModelValue = typeof props.modelValue; - const emits = defineEmits<{ /** * modelValue prop two-way binding diff --git a/packages/oruga/src/components/steps/Steps.vue b/packages/oruga/src/components/steps/Steps.vue index 06140a0c9..cd8964bee 100644 --- a/packages/oruga/src/components/steps/Steps.vue +++ b/packages/oruga/src/components/steps/Steps.vue @@ -30,6 +30,8 @@ defineOptions({ configField: "steps", }); +type ModelValue = StepsProps["modelValue"]; + const props = withDefaults(defineProps>(), { override: undefined, modelValue: undefined, @@ -59,8 +61,6 @@ const props = withDefaults(defineProps>(), { ariaPreviousLabel: () => getOption("steps.ariaPreviousLabel", "Previous"), }); -type ModelValue = StepsProps["modelValue"]; - const emits = defineEmits<{ /** * modelValue prop two-way binding diff --git a/packages/oruga/src/components/switch/Switch.vue b/packages/oruga/src/components/switch/Switch.vue index 996607e20..0237657a1 100644 --- a/packages/oruga/src/components/switch/Switch.vue +++ b/packages/oruga/src/components/switch/Switch.vue @@ -2,7 +2,7 @@ import { computed, ref, useAttrs, useId, type PropType } from "vue"; import { getOption } from "@/utils/config"; -import { defineClasses, useInputHandler, useVModel } from "@/composables"; +import { defineClasses, useInputHandler } from "@/composables"; import { injectField } from "../field/fieldInjection"; @@ -212,7 +212,7 @@ const { onBlur, onFocus, onInvalid, setFocus } = useInputHandler( const { parentField } = injectField(); // const vmodel = defineModel({ default: undefined }); -const vmodel = useVModel(); +const vmodel = defineModel({ default: undefined }); // if not `label` is given and `id` is given set as `for` property on o-field wrapper if (!props.label && props.id) parentField?.value?.setInputId(props.id); diff --git a/packages/oruga/src/components/tabs/Tabs.vue b/packages/oruga/src/components/tabs/Tabs.vue index 6c0a06632..fc7a6ae2d 100644 --- a/packages/oruga/src/components/tabs/Tabs.vue +++ b/packages/oruga/src/components/tabs/Tabs.vue @@ -36,6 +36,8 @@ defineOptions({ configField: "tabs", }); +type ModelValue = TabsProps["modelValue"]; + const props = withDefaults(defineProps>(), { override: undefined, modelValue: undefined, @@ -59,8 +61,6 @@ const props = withDefaults(defineProps>(), { multiline: false, }); -type ModelValue = TabsProps["modelValue"]; - const emits = defineEmits<{ /** * modelValue prop two-way binding diff --git a/packages/oruga/src/components/taginput/Taginput.vue b/packages/oruga/src/components/taginput/Taginput.vue index 276e2a165..43c2f8c9c 100644 --- a/packages/oruga/src/components/taginput/Taginput.vue +++ b/packages/oruga/src/components/taginput/Taginput.vue @@ -34,6 +34,8 @@ defineOptions({ inheritAttrs: false, }); +type ModelValue = TaginputProps["modelValue"]; + const props = withDefaults(defineProps>(), { override: undefined, modelValue: undefined, @@ -71,8 +73,6 @@ const props = withDefaults(defineProps>(), { autocompleteClasses: () => getOption("taginput.autocompleteClasses", {}), }); -type ModelValue = TaginputProps["modelValue"]; - const emits = defineEmits<{ /** * modelValue prop two-way binding diff --git a/packages/oruga/src/components/upload/Upload.vue b/packages/oruga/src/components/upload/Upload.vue index 1d6a37983..24c50e042 100644 --- a/packages/oruga/src/components/upload/Upload.vue +++ b/packages/oruga/src/components/upload/Upload.vue @@ -28,6 +28,8 @@ defineOptions({ inheritAttrs: false, }); +type ModelValue = UploadProps["modelValue"]; + const props = withDefaults(defineProps>(), { override: undefined, modelValue: undefined, @@ -42,8 +44,6 @@ const props = withDefaults(defineProps>(), { customValidity: "", }); -type ModelValue = typeof props.modelValue; - const emits = defineEmits<{ /** * modelValue prop two-way binding @@ -76,7 +76,7 @@ const { checkHtml5Validity, onFocus, onBlur, onInvalid, isValid, setFocus } = // inject parent field component if used inside one const { parentField } = injectField(); -const vmodel = defineModel({ default: null }); +const vmodel = defineModel({ default: undefined }); const dragDropFocus = ref(false); diff --git a/packages/oruga/src/composables/index.ts b/packages/oruga/src/composables/index.ts index 17d50c549..f903cd1d6 100644 --- a/packages/oruga/src/composables/index.ts +++ b/packages/oruga/src/composables/index.ts @@ -8,6 +8,5 @@ export * from "./useParentProvider"; export * from "./useClickOutside"; export * from "./useScrollingParent"; export * from "./useObjectMap"; -export * from "./useVModel"; export * from "./useOptions"; export * from "./usePreventScrolling"; diff --git a/packages/oruga/src/composables/useVModel.ts b/packages/oruga/src/composables/useVModel.ts deleted file mode 100644 index 7cfa044c0..000000000 --- a/packages/oruga/src/composables/useVModel.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { ref, watch, nextTick, getCurrentInstance, type Ref } from "vue"; - -/** - * Adaption of {@link https://vueuse.org/core/useVModel/} options. - */ -export interface PropBindingOptions { - /** - * Attempting to check for changes of properties in a deeply nested object or array. - * Apply only when `passive` option is set to `true` - * - * @default false - */ - deep?: boolean; -} - -/** - * @deprecated can be replaced by `defineModel` with vue 3.5 - * Use two-way model binding in script setup syntax. - * Adaption of {@link https://vueuse.org/core/useVModel/}. - * @param name Property name - * @param options Extended usage options - * @returns Ref - */ -export function useVModel( - name: string = "modelValue", - options?: PropBindingOptions, -): Ref { - // getting a hold of the internal instance in setup() - const vm = getCurrentInstance(); - if (!vm) - throw new Error( - "useVModel must be called within a component setup function.", - ); - - /** reactive two-way binding model */ - const proxy = ref(vm.proxy?.$props[name!]) as Ref; - - let isUpdating = false; - - watch( - () => vm.proxy?.$props[name!], - (value) => { - if (!isUpdating) { - isUpdating = true; - proxy.value = value; - nextTick(() => (isUpdating = false)); - } - }, - ); - - watch( - proxy, - (value) => { - if ( - (!isUpdating && value !== vm.proxy?.$props[name!]) || - options?.deep - ) - vm.emit(`update:${name}`, value); - }, - { deep: options?.deep }, - ); - - return proxy; -}