From 950dd10372ade737645c1cc2b7ce106545f4ded1 Mon Sep 17 00:00:00 2001 From: neverland Date: Wed, 30 Sep 2020 11:42:23 +0800 Subject: [PATCH] fix(Field): incorrect maxlength slicing (#7284) * fix(Field): incorrect maxlength slicing * chore: robust --- src/field/index.js | 9 +++++++-- src/field/test/index.spec.js | 12 ++++++++++-- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/field/index.js b/src/field/index.js index 4bc2cb8e5..0627b2f20 100644 --- a/src/field/index.js +++ b/src/field/index.js @@ -294,10 +294,15 @@ export default createComponent({ updateValue(value, trigger = 'onChange') { value = isDef(value) ? String(value) : ''; - // native maxlength not work when type is number + // native maxlength have incorrect line-break counting + // see: https://github.com/youzan/vant/issues/5033 const { maxlength } = this; if (isDef(maxlength) && value.length > maxlength) { - value = value.slice(0, maxlength); + if (this.value && this.value.length === +maxlength) { + ({ value } = this); + } else { + value = value.slice(0, maxlength); + } } if (this.type === 'number' || this.type === 'digit') { diff --git a/src/field/test/index.spec.js b/src/field/test/index.spec.js index 08d23757f..e0a145001 100644 --- a/src/field/test/index.spec.js +++ b/src/field/test/index.spec.js @@ -171,17 +171,25 @@ test('maxlength', async () => { value: 1234, type: 'number', }, + listeners: { + input(value) { + wrapper && wrapper.setProps({ value }); + }, + }, }); const input = wrapper.find('input'); expect(input.element.value).toEqual('123'); input.element.value = 1234; - await later(); input.trigger('input'); - expect(input.element.value).toEqual('123'); expect(wrapper.emitted('input')[0][0]).toEqual('123'); + + // see: https://github.com/youzan/vant/issues/7265 + input.element.value = 1423; + input.trigger('input'); + expect(input.element.value).toEqual('123'); }); test('clearable prop', () => {