From db53e8d408d0b0b005d7b624441bee3d58560163 Mon Sep 17 00:00:00 2001 From: inottn Date: Sun, 14 Dec 2025 20:04:33 +0800 Subject: [PATCH] fix(Field): correctly limit maxlength when pasting multiple emojis (#13713) --- packages/vant/src/field/Field.tsx | 3 ++- packages/vant/src/field/test/index.spec.js | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/packages/vant/src/field/Field.tsx b/packages/vant/src/field/Field.tsx index f79b8eadd..4a52e916f 100644 --- a/packages/vant/src/field/Field.tsx +++ b/packages/vant/src/field/Field.tsx @@ -308,10 +308,11 @@ export default defineComponent({ } // Remove redundant interpolated values, // make it consistent with the native input maxlength behavior. - const selectionEnd = inputRef.value?.selectionEnd; + let selectionEnd = inputRef.value?.selectionEnd; if (state.focused && selectionEnd) { const valueArr = [...value]; const exceededLength = valueArr.length - +maxlength; + selectionEnd = getStringLength(value.slice(0, selectionEnd)); valueArr.splice(selectionEnd - exceededLength, exceededLength); return valueArr.join(''); } diff --git a/packages/vant/src/field/test/index.spec.js b/packages/vant/src/field/test/index.spec.js index ca171d8bc..a1be9ffcf 100644 --- a/packages/vant/src/field/test/index.spec.js +++ b/packages/vant/src/field/test/index.spec.js @@ -644,3 +644,22 @@ test('should update selection range correctly when using formatter with emoji', expect(input.element.selectionEnd).toEqual(4); }); + +test('should limit maxlength correctly when pasting multiple emojis', async () => { + const wrapper = mount(Field, { + props: { + maxlength: 4, + modelValue: '', + }, + }); + + const input = wrapper.find('input'); + await input.trigger('focus'); + + input.element.value = '1😀😀😀😀'; + input.element.selectionEnd = 9; + input.trigger('input'); + + expect(wrapper.emitted('update:modelValue')[0][0]).toEqual('1😀😀😀'); + expect(input.element.value).toEqual('1😀😀😀'); +});