diff --git a/.changeset/seven-coats-appear.md b/.changeset/seven-coats-appear.md new file mode 100644 index 0000000000..335f789227 --- /dev/null +++ b/.changeset/seven-coats-appear.md @@ -0,0 +1,7 @@ +--- +"@lynx-js/web-core-server": patch +"@lynx-js/web-core": patch +"@lynx-js/web-explorer": patch +--- + +feat: builtinTagTransformMap add `'input': 'x-input'` diff --git a/packages/web-platform/web-core-server/src/createLynxView.ts b/packages/web-platform/web-core-server/src/createLynxView.ts index 23635e608f..5484f3d1d2 100644 --- a/packages/web-platform/web-core-server/src/createLynxView.ts +++ b/packages/web-platform/web-core-server/src/createLynxView.ts @@ -81,6 +81,7 @@ const builtinTagTransformMap = { 'image': 'x-image', 'list': 'x-list', 'svg': 'x-svg', + 'input': 'x-input', }; // @ts-expect-error diff --git a/packages/web-platform/web-core/src/apis/LynxView.ts b/packages/web-platform/web-core/src/apis/LynxView.ts index 0e83261b65..b6e7e07a67 100644 --- a/packages/web-platform/web-core/src/apis/LynxView.ts +++ b/packages/web-platform/web-core/src/apis/LynxView.ts @@ -420,6 +420,7 @@ export class LynxView extends HTMLElement { 'image': 'x-image', 'list': 'x-list', 'svg': 'x-svg', + 'input': 'x-input', ...this.overrideLynxTagToHTMLTagMap, }; if (!this.shadowRoot) { diff --git a/packages/web-platform/web-tests/tests/react.spec.ts b/packages/web-platform/web-tests/tests/react.spec.ts index 9ce2603797..cf6c1450ef 100644 --- a/packages/web-platform/web-tests/tests/react.spec.ts +++ b/packages/web-platform/web-tests/tests/react.spec.ts @@ -3003,6 +3003,16 @@ test.describe('reactlynx3 tests', () => { const result = await page.locator('.result').first().innerText(); expect(result).toBe('foobar-6-6'); }); + // input/bindinput test-case start for + test('basic-element-input-bindinput', async ({ page }, { title }) => { + await goto(page, title); + await page.locator('input').press('Enter'); + await wait(200); + await page.locator('input').fill('foobar'); + await wait(200); + const result = await page.locator('.result').first().innerText(); + expect(result).toBe('foobar-6-6'); + }); // input/bindinput test-case end test( 'basic-element-x-input-getValue', diff --git a/packages/web-platform/web-tests/tests/react/basic-element-input-bindinput/index.jsx b/packages/web-platform/web-tests/tests/react/basic-element-input-bindinput/index.jsx new file mode 100644 index 0000000000..f6e138ab2f --- /dev/null +++ b/packages/web-platform/web-tests/tests/react/basic-element-input-bindinput/index.jsx @@ -0,0 +1,42 @@ +// Copyright 2023 The Lynx Authors. All rights reserved. +// Licensed under the Apache License Version 2.0 that can be found in the +// LICENSE file in the root directory of this source tree. +import { root, useState } from '@lynx-js/react'; + +function App() { + const value = 'bindinput'; + const [result, setResult] = useState(); + + const onInput = ({ detail }) => { + if (typeof detail !== 'object') { + throw new Error( + `detail type not match. expect object, got ${typeof detail}`, + ); + } + + const { value, cursor, textLength, selectionStart, selectionEnd } = detail; + + if (value.length !== textLength) { + throw new Error( + `input length not match. expect ${textLength}, got ${value.length}`, + ); + } + + setResult(`${value}-${selectionStart}-${selectionStart}`); + }; + + return ( + + + + {result} + + + ); +} + +root.render();