Skip to content

Commit 7436770

Browse files
committed
fix(VNumberInput): resync display after model is overridden
1 parent 27962f3 commit 7436770

2 files changed

Lines changed: 24 additions & 1 deletion

File tree

packages/vuetify/src/components/VNumberInput/VNumberInput.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ export const VNumberInput = genericComponent<VNumberInputSlots>()({
249249
vTextFieldRef.value?.controlRef?.dispatchEvent(new Event('change', { bubbles: true }))
250250
}
251251

252-
function toggleUpDown (increment = true) {
252+
async function toggleUpDown (increment = true) {
253253
if (controlsDisabled.value) return
254254
if (increment ? !canIncrease.value : !canDecrease.value) return
255255
if (model.value == null) {
@@ -265,6 +265,10 @@ export const VNumberInput = genericComponent<VNumberInputSlots>()({
265265
inputText.value = correctPrecision(model.value - props.step, inferredPrecision)
266266
emitChange()
267267
}
268+
await nextTick()
269+
if (model.value !== toNumber(inputText.value)) {
270+
inputText.value = model.value == null ? null : correctPrecision(model.value, inferredPrecision)
271+
}
268272
}
269273

270274
function onBeforeinput (e: InputEvent) {

packages/vuetify/src/components/VNumberInput/__tests__/VNumberInput.spec.browser.tsx

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -583,4 +583,23 @@ describe('VNumberInput', () => {
583583
expect(onChange).toHaveBeenCalledTimes(2)
584584
})
585585
})
586+
587+
// https://github.com/vuetifyjs/vuetify/issues/23098
588+
it('keeps the display in sync when the emitted value is overridden', async () => {
589+
const model = ref(0)
590+
render(() => (
591+
<VNumberInput
592+
modelValue={ model.value }
593+
onUpdate:modelValue={ (val: number) => { model.value = Math.max(0, val) } }
594+
/>
595+
))
596+
597+
await userEvent.click(screen.getByTestId('decrement'))
598+
await expect.element(screen.getByCSS('input')).toHaveValue('0')
599+
expect(model.value).toBe(0)
600+
601+
await userEvent.click(screen.getByTestId('increment'))
602+
await expect.element(screen.getByCSS('input')).toHaveValue('1')
603+
expect(model.value).toBe(1)
604+
})
586605
})

0 commit comments

Comments
 (0)