Я использую Typescript с React. У меня возникли проблемы с пониманием того, как использовать ссылки, чтобы получить статическую типизацию и intellisense в отношении узлов реакции, на которые ссылаются ссылки. Мой код выглядит следующим образом.
import * as React from 'react';
interface AppState {
count: number;
}
interface AppProps {
steps: number;
}
interface AppRefs {
stepInput: HTMLInputElement;
}
export default class TestApp extends React.Component<AppProps, AppState> {
constructor(props: AppProps) {
super(props);
this.state = {
count: 0
};
}
incrementCounter() {
this.setState({count: this.state.count + 1});
}
render() {
return (
<div>
<h1>Hello World</h1>
<input type="text" ref="stepInput" />
<button onClick={() => this.incrementCounter()}>Increment</button>
Count : {this.state.count}
</div>
);
}}
источник
refs
атрибутом класса будут устаревшими в следующих версиях React.Один из способов (который я делал ) - настроить вручную:
то вы даже можете обернуть это в более приятную функцию получения (например, здесь ):
источник
any
здесь не обязательно. Большинство примеров я вижу в использованииHTMLInputElement
. Просто констатирую очевидное, но если ваша ссылка находится в компоненте React (т.PeoplePicker
Е.), Вы можете использовать этот компонент как тип для ввода текста.Начиная с React 16.3, можно добавлять ссылки с помощью React.createRef, как указал Джефф Боуэн в своем ответе. Однако вы можете воспользоваться Typescript, чтобы лучше напечатать свою ссылку.
В вашем примере вы используете ref для элемента ввода. Я бы сделал это следующим образом:
Делая это, когда вы хотите использовать эту ссылку, вы получаете доступ ко всем методам ввода:
Вы также можете использовать его для пользовательских компонентов:
а затем получить, например, доступ к реквизитам:
источник
РЕДАКТИРОВАТЬ: это больше не правильный способ использовать ссылки с Typescript. Посмотрите на ответ Джеффа Боуэна и проголосуйте за него, чтобы он стал заметнее.
Нашел ответ на проблему. Используйте ссылки, как показано ниже, внутри класса.
Спасибо @basarat за то, что указали в правильном направлении.
источник
Property 'stepInput' does not exist on type '{ [key: string]: Component<any, any> | Element; }'
при попытке доступаthis.refs.stepInput
.refs
объекта была только[key: string]
запись.React.createRef
(компоненты класса)Примечание. Пропуск старого API String Refs здесь ...
Ссылки только для чтения для узлов DOM: Изменяемые ссылки для произвольных сохраненных значений:React.useRef
(Крючки / функциональные компоненты)Примечание. Не выполняйте инициализацию
useRef
с помощьюnull
в этом случае. Сделал быrenderCountRef
типreadonly
(см. Пример ). Если вам нужно указатьnull
начальное значение, сделайте следующее:Обратные вызовы (работают для обоих)
Образец детской площадки
источник
useRef() as MutableRefObject<HTMLInputElement>
иuseRef<HTMLInputElement>(null)
?current
свойствоMutableRefObject<HTMLInputElement>
может быть изменено, при этомuseRef<HTMLInputElement>(null)
создаетсяRefObject
тип,current
помеченный какreadonly
. Первый можно использовать, если вам нужно самостоятельно изменить текущие узлы DOM в ссылках, например, в сочетании с внешней библиотекой. Она также может быть написана безas
:useRef<HTMLInputElement | null>(null)
. Последний - лучший выбор для DOM-узлов, управляемых React, как и используется в большинстве случаев. React хранит узлы в самих справочниках, и вы не хотите возиться с изменением этих значений.Если вы используете
React.FC
, добавьтеHTMLDivElement
интерфейс:И используйте это так:
источник
Чтобы использовать стиль обратного вызова ( https://facebook.github.io/react/docs/refs-and-the-dom.html ), как рекомендовано в документации React, вы можете добавить определение свойства в класс:
источник
Не имея полного примера, вот мой небольшой тестовый сценарий для получения пользовательского ввода при работе с React и TypeScript. Частично основано на других комментариях и этой ссылке https://medium.com/@basarat/strongly-typed-refs-for-react-typescript-9a07419f807#.cdrghertm
}
источник
Для пользователя машинописного текста конструктор не требуется.
...
...
источник
Из определения типа React
Таким образом, вы можете получить доступ к вашему элементу refs следующим образом
без переопределения индекса refs.
Как упоминал @manakor, вы можете получить ошибку, например
если вы переопределяете ссылки (зависит от используемой IDE и версии ts)
источник
Просто чтобы добавить другой подход - вы можете просто использовать свой реф, например:
источник
Я всегда так делаю, в таком случае, чтобы получить реф
let input: HTMLInputElement = ReactDOM.findDOMNode<HTMLInputElement>(this.refs.input);
источник
Если вы не хотите пересылать свой
ref
, в интерфейсе Props вам нужно использоватьRefObject<CmpType>
тип изimport React, { RefObject } from 'react';
источник
Для тех, кто интересуется, как это сделать, когда у вас есть массив элементов:
источник
поместить их в объект
источник