在Ionic 7中,如何在IonInput字段上设置光标焦点?

ktca8awb  于 12个月前  发布在  Ionic
关注(0)|答案(2)|浏览(180)

我使用的是Ionic 7和React 18。当加载组件时,如何使表单上的特定输入自动拥有光标的焦点?我认为“autofocus”是一种方法。

<IonInput
          autofocus
            placeholder='First Name'
            value=''
          />

字符串
但这并没有得到光标焦点。一个例子可以在这里看到--https://stackblitz.com/edit/an5yjh-xqjw5k?file=src%2FApp.tsx,src%2Fcomponents%2FMyForm.tsx

**编辑:**根据给出的答案,我尝试了这个方法,但焦点没有设置为页面上的唯一字段。

wwwo4jvm

wwwo4jvm1#

您可以尝试使用React的useRefuseEffect挂钩:

import React, { useEffect, useRef } from 'react'
import { IonButton, IonInput } from '@ionic/react'

const MyForm = () => {
  const inputRef = useRef<HTMLIonInputElement>(null);

  useEffect(() => {
    setTimeout(() => { // Added a timeout to make sure the element is loaded
      inputRef.current?.setFocus();
    }, 0);
  }, []);

  return (
    <form>
      <IonInput
        ref={inputRef}
        placeholder='First Name'
        value=''
      />
    
      <IonButton type='submit'>Save And Continue</IonButton>
    </form>
  );
}

export default MyForm;

字符串
useRef挂接创建一个对IonInput元素的引用(inputRef)。useEffect挂接确保在安装组件时在IonInput上设置焦点。超时用于确保在尝试设置焦点之前加载DOM元素。
IonInput已更新为使用ref={inputRef},而不是autofocus属性。
这会在呈现MyForm组件时将焦点设置在“First Name”的IonInput字段上。
您可以在this stackblitz中看到它的实际应用。
有没有可能调用setTimeout而元素没有被加载?我很好奇,是否有一种更简单的方法,只有在我们确信输入在屏幕上时才应用焦点。
是的,我已经更新了stackblitz
由于IonInput的呈现是直接的,并且不严重依赖于异步操作,因此最简单和最有效的方法应该是确保在完全装入组件及其所有子组件之后设置焦点。

import React, { useEffect, useRef } from 'react'
import { IonButton, IonInput } from '@ionic/react'

const MyForm = () => {
  const inputRef = useRef<HTMLIonInputElement>(null);

  useEffect(() => {
    if (inputRef.current) {
      const observer = new MutationObserver(() => {
        if (inputRef.current) {
          inputRef.current.setFocus();
          observer.disconnect();
        }
      });

      observer.observe(document, { childList: true, subtree: true });
    }
  }, []);

  return (
    <form>
      <IonInput
        ref={inputRef}
        placeholder='First Name'
        value=''
      />
    
      <IonButton type='submit'>Save And Continue</IonButton>
    </form>
  );
}

export default MyForm;


MutationObserver将监视DOM中的更改。当它检测到更改时,它将检查IonInput是否可用,并设置焦点。
断开观察器(mentioned here)允许在设置焦点后断开观察器,以防止进一步进行不必要的检查。

wbgh16ku

wbgh16ku2#

Ionic为IonInput组件提供了一个名为setFocus的方法
提供的示例将不工作B/C你使用的是提交类型按钮,使用常规的IonButton作品。

const MyForm = () => {
  const firstNameInput = useRef<HTMLIonInputElement>(null);
  const handleButtonClick = () => {
    firstNameInput.current?.setFocus();
  };

  return (
    <>
      <form>
        <IonInput ref={firstNameInput} placeholder="First Name" value="" />
        <IonButton onClick={handleButtonClick}>Focus Input</IonButton>
        {/* <IonButton type="submit">Save And Continue</IonButton> */}
      </form>
    </>
 );
};

字符串

相关问题