Я пытаюсь сделать что-то похожее на это. Однако я хотел бы, чтобы поле ввода оставалось в фокусе, пока пользователь не щелкнет где-нибудь, кроме меню или любого из подменю. Я пытаюсь использовать ссылки, следуя документации React (пытаюсь дублировать ее на самом деле), но не могу заставить ее работать.
Ошибка
"Uncaught TypeError: _this.textInput.current.focus is not a function"
Код (компонент поля ввода)
import React from 'react';
import styled from 'styled-components';
export default class TextInput extends React.Component {
constructor(props) {
super(props);
this.textInput = React.createRef();
}
focusTextInput = () => {
this.textInput.current.focus();
}
render = () => {
return (
<div>
<TextInputField
font = {this.props.font}
fontSize = {this.props.fontSize}
placeholder = {"What?"}
type = "text"
value = {this.props.title}
titleLength = {this.props.titleLength}
onChange = {this.props.change}
onFocus = {this.props.focus}
onBlur = {this.props.blur}
id = "titleInput"
textColor = {this.props.textColor}
ref = {this.textInput} />
<input
type = "button"
value = "Focus the text input"
onClick = {this.focusTextInput}
/>
</div>
);
}
}
const TextInputField = styled.input`
width: 90%;
height: ${props => props.fontSize * 1.25}vw;
line-height: ${props => props.fontSize * 1.25}vw;
text-align: center;
position: absolute;
bottom: -12.5vw;
left: 5%;
margin: 0 auto;
background-color: transparent;
border: transparent;
text-overflow: ellipsis;
color: ${props => props.textColor};
font-size: ${props => props.fontSize}vw;
font-family: ${props => props.font};
&:hover {
background-color: rgba(0, 0, 0, 0.2);
}
&:focus {
outline: none;
background-color: rgba(0, 0, 0, 0.5);
}
`;
Хорошо, так это стилизованные компоненты, которые все портят? Хотя это странно, я могу заставить его работать, используя id и getElementById, почему это так?





вам нужно прикрепить innerRef к стилизованному компоненту, примерно так.
const StyledInput = styled.input`
some: styles;
`;
<StyledInput innerRef = {comp => this.input = comp} />
// this.input.focus() works ?
Спасибо! Я понял это после того, как предыдущий человек указал, что проблема связана с тем, что я использую стилизованные компоненты.
innerRef помог мне в ситуации с аналогичной ошибкой, поэтому я считаю, что ответ выше должен быть принят
Как вы думаете, почему у
TextInputFieldдолжен быть метод фокусировки? Это не HTMLElement.