Ссылки не работают

Я пытаюсь сделать что-то похожее на это. Однако я хотел бы, чтобы поле ввода оставалось в фокусе, пока пользователь не щелкнет где-нибудь, кроме меню или любого из подменю. Я пытаюсь использовать ссылки, следуя документации 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);
}
`;

Как вы думаете, почему у TextInputField должен быть метод фокусировки? Это не HTMLElement.

dfsq 03.06.2018 11:13

Хорошо, так это стилизованные компоненты, которые все портят? Хотя это странно, я могу заставить его работать, используя id и getElementById, почему это так?

ejanson 03.06.2018 11:17
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
2
2
1 943
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

вам нужно прикрепить innerRef к стилизованному компоненту, примерно так.

const StyledInput = styled.input`
  some: styles;
`;

<StyledInput innerRef = {comp => this.input = comp} />

// this.input.focus() works ?

Спасибо! Я понял это после того, как предыдущий человек указал, что проблема связана с тем, что я использую стилизованные компоненты.

ejanson 03.06.2018 12:58

innerRef помог мне в ситуации с аналогичной ошибкой, поэтому я считаю, что ответ выше должен быть принят

krankuba 04.10.2018 17:13

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