From e4b1e0807f4d9e28acf9fe3a4576e2f9a95431c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=AC=A2?= Date: Mon, 14 Jul 2025 17:27:23 +0800 Subject: [PATCH] feat: Add IME judgment --- src/Input.tsx | 7 ++++++- tests/index.test.tsx | 39 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/Input.tsx b/src/Input.tsx index 619eff8..0dbffb6 100644 --- a/src/Input.tsx +++ b/src/Input.tsx @@ -160,7 +160,12 @@ const Input = forwardRef((props, ref) => { }; const handleKeyDown = (e: React.KeyboardEvent) => { - if (onPressEnter && e.key === 'Enter' && !keyLockRef.current) { + if ( + onPressEnter && + e.key === 'Enter' && + !keyLockRef.current && + !e.nativeEvent.isComposing + ) { keyLockRef.current = true; onPressEnter(e); } diff --git a/tests/index.test.tsx b/tests/index.test.tsx index d2107f0..4e4567c 100644 --- a/tests/index.test.tsx +++ b/tests/index.test.tsx @@ -1,7 +1,7 @@ import { fireEvent, render } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { spyElementPrototypes } from '@rc-component/util/lib/test/domHook'; -import React from 'react'; +import React, { ElementType } from 'react'; import Input from '../src'; import type { InputRef } from '../src/interface'; import { resolveOnChange } from '../src/utils/commonUtils'; @@ -504,3 +504,40 @@ describe('resolveChange should work', () => { fireEvent.compositionEnd(container.querySelector('textarea')!); expect(onChange).toHaveBeenCalled(); }); + +describe('Input IME behavior', () => { + it('should ignore Enter during composition', () => { + const onPressEnter = jest.fn(); + const { container } = render(); + const input = container.querySelector('input')!; + + fireEvent.compositionStart(input); + + fireEvent.keyDown(input, { + key: 'Enter', + keyCode: 229, + isComposing: true, + nativeEvent: { isComposing: true }, + }); + + fireEvent.compositionUpdate(input, { data: '开始' }); + + expect(onPressEnter).not.toHaveBeenCalled(); + + fireEvent.compositionEnd(input); + fireEvent.keyDown(input, { + key: 'Enter', + nativeEvent: { isComposing: false }, + }); + expect(onPressEnter).toHaveBeenCalledTimes(1); + }); + + it('should work with actual IME input', async () => { + const user = userEvent.setup(); + const onPressEnter = jest.fn(); + const { container } = render(); + + await user.type(container.querySelector('input')!, 'abc{enter}'); + expect(onPressEnter).toHaveBeenCalled(); + }); +});