В моем веб-приложении есть метод косвенного заполнения текстового поля, и, поскольку оно состоит из нескольких кликов (для контекста, это календарь) и нескольких полей, я хотел бы показать, какое поле они заполняют, когда они нажмите следующую кнопку.
Я не могу поместить фокус в само текстовое поле . Это отвлечет пользователя от интерфейса, на котором он щелкает.
У меня это работает для ввода, но я не могу заставить это работать для текстовых полей. Вот два набора кода, конкретно, где я ошибаюсь?
TextField (не работает)
import React, { useState, useRef, useEffect } from "react";
import { makeStyles } from "@material-ui/core/styles";
import { Button, TextField } from "@material-ui/core";
const useStyles = makeStyles(theme => ({
root: {
"& > *": {
margin: theme.spacing(1)
}
}
}));
export default function Inputs() {
const classes = useStyles();
const [focused, setFocused] = useState(false);
const focusedRef = useRef();
const toggleFocusOnElement = () => {
setFocused(prevFocused => !prevFocused);
};
useEffect(() => {
if (focused) {
focusedRef.current.classList.add("Mui-focused");
} else {
focusedRef.current.classList.remove("Mui-focused");
}
}, [focused]);
return (
<>
<Button onClick={toggleFocusOnElement}>
{focused ? "Remove" : "Fake"} focus
</Button>
<form className={classes.root} noValidate autoComplete="off">
<TextField
inputRef={focusedRef}
defaultValue="Hello world"
inputProps={{ "aria-label": "description" }}
/>
</form>
</>
);
}
![Edit Material demo](https://codesandbox.io/static/img/play-codesandbox.svg)
Вход (рабочий)
import React, { useState, useRef, useEffect } from "react";
import { makeStyles } from "@material-ui/core/styles";
import { Button, Input } from "@material-ui/core";
const useStyles = makeStyles(theme => ({
root: {
"& > *": {
margin: theme.spacing(1)
}
}
}));
export default function Inputs() {
const classes = useStyles();
const [focused, setFocused] = useState(false);
const focusedRef = useRef();
const toggleFocusOnElement = () => {
setFocused(prevFocused => !prevFocused);
};
useEffect(() => {
if (focused) {
focusedRef.current.classList.add("Mui-focused");
} else {
focusedRef.current.classList.remove("Mui-focused");
}
}, [focused]);
return (
<>
<Button onClick={toggleFocusOnElement}>
{focused ? "Remove" : "Fake"} focus
</Button>
<form className={classes.root} noValidate autoComplete="off">
<Input
ref={focusedRef}
defaultValue="Hello world"
inputProps={{ "aria-label": "description" }}
/>
</form>
</>
);
}
![Edit Material demo](https://codesandbox.io/static/img/play-codesandbox.svg)
Есть ли способ обойти это ограничение или лучший способ подделать фокус?