Реагировать на useref, не добавляя состояние фокуса в поле

Я пытался найти решение для этого, где я хотел бы добавить состояние фокуса в свое поле ввода. Но, похоже, это не работает:

const textareaRef = useRef<HTMLInputElement>(null);
...

const handleClick = () => {
        if (textareaRef.current) {
            alert('Field clicked');
            textareaRef.current.focus();
            textareaRef.current.click();
        }
    };

...

<input
     ref = {textareaRef}
     onClick = {handleClick}
     onFocus = {(e) => e.persist()}
     spellCheck = "false"
/>

Это не работает, и основная причина — показать мобильную клавиатуру. Смотрите здесь видео о том, что это не работает https://share.getcloudapp.com/jkuYLqO5 и здесь без предупреждения https://share.getcloudapp.com/wbuKwrLE

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
6 085
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете сделать это в хуке useEffect(). Компонент ниже издевается над вашим сценарием. Когда компонент загружается, я заставляю focus() появляться на входе.

import React, { useEffect, useRef } from 'react';


const UseRefBasics = () => {
  const refContainer = useRef(null);

  const handleSubmit = (e) => {
    e.preventDefault();
    console.info(refContainer.current.value);
  };
  useEffect(() => {
    console.info(refContainer.current);
    refContainer.current.focus();
  });

  return (
    <>
      <form className='form' onSubmit = {handleSubmit}>
        <div>
          <input type='text' ref = {refContainer} />
        </div>
        <button type='submit'>submit</button>
      </form>
    </>
  );
};

export default UseRefBasics;

Это общий сценарий, который я дал. Вы можете использовать useEffect() и получать фокус при обновлении состояния, предоставляя другой аргумент useEffect(()=>{},[state1]) или любым другим способом, который вам нужен.

Ответ принят как подходящий

Я не могу воспроизвести ошибку в настольном браузере. Какой браузер в записи экрана?

function App() {
  const textareaRef = React.useRef();
  const handleClick = () => {
    if (textareaRef.current) {
        console.info('Field clicked');
        textareaRef.current.focus();
    }
  };

  return (
    <div>
      <div onClick = {handleClick}>click me to focus input</div>
      <input
       ref = {textareaRef}
       onFocus = {(e) => e.persist()}
      />
    </div>
  )
}

ReactDOM.render(
  <App />,
  document.getElementById('root')
)
<script src = "https://unpkg.com/[email protected]/umd/react.production.min.js"></script>
<script src = "https://unpkg.com/[email protected]/umd/react-dom.production.min.js"></script>

<div id = "root"></div>

Да, это действительно странно. Это симулятор браузера iphone Safari.

designtocode 11.12.2020 12:30

Ах я вижу. Это не в том же компоненте. Щелчок происходит в дочернем компоненте. Как вы думаете, я могу заставить его работать в дочернем компоненте, щелкнув, чтобы сфокусировать его? @hackape

designtocode 11.12.2020 12:53

Спасибо вам большое за это! Это привело меня в правильном направлении :) Я вызвал щелчок по элементу div, и это сработало.

designtocode 11.12.2020 13:08

Другие вопросы по теме

Измените :active background-color вкладок React-Bootstrap
TypeError: невозможно прочитать свойство toLowerCase неопределенного с помощью commerce.js
Реагировать на загрузку компонента ниже текущего компонента
Хук React useState, влияющий на переменную по умолчанию, используемую в состоянии, независимо от операторов распространения, Object.assign и т. д
React Router не показывает домашнюю страницу по умолчанию при загрузке страницы
Необходимо использовать импорт для загрузки модуля ES: /Users/*path/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js require() модулей ES не поддерживается
Сохранение состояния isAuthenticated после обновления в React
Как использовать SignaturePad с React TypeScript
React Navigation 5 props.navigation.replace («компонент»); работает так же, как navigation.navigate() (кнопки «Назад» по-прежнему отображаются в заголовке)
React Hook useCallback имеет недостающие зависимости: «params» и «posts». Вы также можете выполнить функциональное обновление 'setPosts(p => ...)