Skip to content

Commit 93efd5e

Browse files
fix(Textarea): count does not follow maxCharacter or maxLength (#4088)
* fix(Textarea): `count` does not follow `maxCharacter` or `maxLength` * chore: stash changelog [ci skip] --------- Co-authored-by: tdesign-bot <tdesign@tencent.com>
1 parent 9dd94e0 commit 93efd5e

File tree

3 files changed

+31
-2
lines changed

3 files changed

+31
-2
lines changed

packages/components/textarea/Textarea.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,10 @@ const Textarea = forwardRef<TextareaRefInterface, TextareaProps>((originalProps,
209209
</div>
210210
);
211211

212-
const limitText = renderLimitText(currentLength, maxlength ?? maxcharacter);
212+
const limitText = renderLimitText(
213+
hasMaxcharacter ? characterLength : currentLength,
214+
hasMaxcharacter ? maxcharacter : maxlength,
215+
);
213216

214217
return (
215218
<div style={style} ref={wrapperRef} className={classNames(`${classPrefix}-textarea`, className)}>

packages/components/textarea/__tests__/textarea.test.tsx

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import React from 'react';
2-
import { render, fireEvent, vi, mockDelay } from '@test/utils';
2+
import { fireEvent, mockDelay, render, vi } from '@test/utils';
33
import { Textarea } from '..';
44

55
describe('Textarea 组件测试', () => {
@@ -94,4 +94,24 @@ describe('Textarea 组件测试', () => {
9494

9595
expect(container.getElementsByTagName('textarea')[0].selectionStart).toBe(value.length);
9696
});
97+
98+
test('count follows maxcharacter and maxlength correctly', async () => {
99+
const LIMIT_SELECTOR = '.t-textarea__limit';
100+
101+
const { container: container1 } = render(<Textarea maxcharacter={15} value="hello世界" />);
102+
const limitText1 = container1.querySelector(LIMIT_SELECTOR);
103+
expect(limitText1?.textContent).toBe('9/15'); // hello(5) + 世(2) + 界(2) = 9
104+
105+
const { container: container2 } = render(<Textarea maxlength={15} value="hello世界" />);
106+
const limitText2 = container2.querySelector(LIMIT_SELECTOR);
107+
expect(limitText2?.textContent).toBe('7/15');
108+
109+
const { container: container3 } = render(<Textarea maxcharacter={15} value="hi👋🌍" />);
110+
const limitText3 = container3.querySelector(LIMIT_SELECTOR);
111+
expect(limitText3?.textContent).toBe('10/15'); // h(1) + i(1) + 👋(4) + 🌍(4) = 10
112+
113+
const { container: container4 } = render(<Textarea maxlength={15} value="hi👋🌍" />);
114+
const limitText4 = container4.querySelector(LIMIT_SELECTOR);
115+
expect(limitText4?.textContent).toBe('4/15');
116+
});
97117
});
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
pr_number: 4088
3+
contributor: RylanBot
4+
---
5+
6+
- fix(Textarea): 修复 `count` 计算逻辑没有遵循 `maxcharacter``maxlength` 的问题 @RylanBot ([#4088](https://github.com/Tencent/tdesign-react/pull/4088))

0 commit comments

Comments
 (0)