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', () => {