Я пытался найти решение для этого, где я хотел бы добавить состояние фокуса в свое поле ввода. Но, похоже, это не работает:
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
Вы можете сделать это в хуке 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>
Ах я вижу. Это не в том же компоненте. Щелчок происходит в дочернем компоненте. Как вы думаете, я могу заставить его работать в дочернем компоненте, щелкнув, чтобы сфокусировать его? @hackape
Спасибо вам большое за это! Это привело меня в правильном направлении :) Я вызвал щелчок по элементу div, и это сработало.
Да, это действительно странно. Это симулятор браузера iphone Safari.