Я пытаюсь использовать React.forwardRef, но не понимаю, как заставить его работать в компоненте на основе классов (а не в HOC).
В примерах документации используются элементы и функциональные компоненты, даже классы-оболочки в функциях для компонентов более высокого порядка.
Итак, начнем с чего-то вроде этого в их ref.js
файле:
const TextInput = React.forwardRef(
(props, ref) => (<input type="text" placeholder="Hello World" ref={ref} />)
);
и вместо этого определив его примерно так:
class TextInput extends React.Component {
render() {
let { props, ref } = React.forwardRef((props, ref) => ({ props, ref }));
return <input type="text" placeholder="Hello World" ref={ref} />;
}
}
или
class TextInput extends React.Component {
render() {
return (
React.forwardRef((props, ref) => (<input type="text" placeholder="Hello World" ref={ref} />))
);
}
}
только работает: /
Кроме того, я знаю, что знаю, что ref - это не способ реакции. Я пытаюсь использовать стороннюю библиотеку холста и хочу добавить некоторые из их инструментов в отдельные компоненты, поэтому мне нужны прослушиватели событий, поэтому мне нужны методы жизненного цикла. Позже он может пойти другим путем, но я хочу попробовать это.
Документы говорят, что это возможно!
Пересылка ссылок не ограничивается компонентами DOM. Вы также можете пересылать ссылки на экземпляры компонентов класса.
Но затем они продолжают использовать HOC вместо классов.
источник
connect
или marterial-uiwithStyles
?connect
илиwithStyles
? Вы должны обернуть все HOCforwardRef
и внутренне использовать "safe" prop для передачи ссылки на самый нижний компонент в цепочке.Вам нужно использовать другое имя опоры для пересылки ссылки в класс.
innerRef
обычно используется во многих библиотеках.источник
beautifulInputElement
это скорее функция, чем элемент React, он должен быть такимconst beautifulInputElement = <BeautifulInputForwardingRef ref={ref => ref && ref.focus()} />
По сути, это просто функция HOC. Если вы хотите использовать его с классом, вы можете сделать это самостоятельно и использовать обычные реквизиты.
Этот шаблон используется, например,
styled-components
и называетсяinnerRef
там.источник
innerRef
, полностью упускает суть. Цель - полная прозрачность: я должен иметь возможность рассматривать a,<FancyButton>
как если бы это был обычный элемент DOM, но, используя подход стилизованных компонентов, мне нужно помнить, что этот компонент использует свойство с произвольным именем для ссылок, а не простоref
.innerRef
в пользу передачи ссылки дочернему с помощьюReact.forwardRef
, что и пытается выполнить OP.Это можно сделать с помощью компонента более высокого порядка, если хотите:
А затем в вашем файле компонента:
Я выполнил предварительную работу с тестами и опубликовал для этого пакет
react-with-forwarded-ref
: https://www.npmjs.com/package/react-with-forwarded-refисточник
Если вам нужно повторно использовать это во многих различных компонентах, вы можете экспортировать эту способность во что-то вроде
withForwardingRef
использование:
источник