Как заставить реагировать-позу работать с компонентами класса?

Я следовал за документация и этот пост в блоге, но я изо всех сил пытаюсь заставить что-нибудь работать.

Локально я получаю следующую ошибку: HEY, LISTEN! No valid DOM ref found. If you're converting an existing component via posed(Component), you must ensure you're passing the ref to the host DOM node via the React.forwardRef function.

Итак, я попытался переслать ссылку:

class ColorCheckbox extends Component {
  setRef = ref => (this.ref = ref);

  constructor(props) {
    super(props);
  }

  render() {
    const { key, children, color } = this.props;
    return (
      <button
        ref = {this.setRef}
        key = {key}
        style = {{
          ...style.box,
          background: color,
        }}
      >
        {children}
      </button>
    );
  }
}

export default forwardRef((props, innerRef) => (
  <ColorCheckbox ref = {innerRef} {...props} />
));

Что работает, поскольку я могу console.inforef внутри моего родительского компонента:

ColorCheckbox {props: Object, context: Object, refs: Object, updater: Object, setRef: function ()…} "ref"

Тем не менее, я все еще получаю сообщение (выше) No valid DOM ref found....

Вот простой Codesandbox, описывающий мою проблему.

О Codesandbox:

Я получаю ошибки разных источников в этой песочнице (они не возникают локально). Если вы измените строку 14 на ColorCheckbox, возникнет ошибка перекрестного происхождения...

Есть идеи?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
355
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Когда вы вызываете forwardRef для компонента на основе класса и пытаетесь передать ref через атрибут ref, это не сработает. Пример документации будет работать только для обычных элементов DOM. Скорее попробуйте сделать следующее:

export default forwardRef((props, innerRef) => (
  <ColorCheckbox forwardRef = {innerRef} {...props} />
));

Я только что использовал произвольное имя, в данном случае forwardRef, чтобы передать ссылку в качестве реквизита. В вашем компоненте на основе класса я изменил часть, где ссылка установлена ​​на кнопке, на это:

const { key, children, selected, color, forwardRef } = this.props;
return (
  <button
    ref = {forwardRef}
    key = {key}
    style = {{
    ...

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

const MyComponent = forwardRef((props, ref) => (
  <div ref = {ref} {...props} />
));

Пожалуйста, обратитесь к моему Вилка Codesandbox, чтобы увидеть рабочий пример.

Спасибо за подробный ответ! ?Есть идеи, почему возникает ошибка перекрестного происхождения?

A7DC 11.04.2019 01:31

@A7DC A7DC В документации по реакции упоминается, что это может произойти при загрузке библиотек из CDN, что может быть связано с тем, как Codesandbox загружает библиотеки, которые мы добавляем. Если одна из этих библиотек выдает ошибку, она отображается как ошибка из-за разных источников.

etarhan 11.04.2019 01:37

Рад, что смог помочь (:

etarhan 11.04.2019 01:42

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