Current всегда имеет значение null при использовании React.createRef

Я пытался сделать это.

Должно быть, мне что-то не хватает, но я не понимаю, почему в этом примере current всегда является null.

class App extends React.PureComponent {
  constructor(props) {
    super(props);
    this.test = React.createRef();
  }
  render() {
    return <div className = "App">current value : {this.test.current + ""}</div>;
  }
}

Вы можете проверить мой тестовый пример здесь

Поведение ключевого слова "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) для оценки ваших знаний,...
38
0
55 082
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Вам не хватает опоры ref = {this.test}.

return (
  <div className = "App" ref = {this.test}>
    current value : {this.test.current + ""}
  </div>
);
Ответ принят как подходящий

Потому что вы забыли присвоить ссылку какому-то элементу dom. Вы только создаете это.

Напишите это так:

class App extends React.PureComponent {
  constructor(props) {
    super(props);
    this.test = React.createRef();
  }

  handleClick = () => alert(this.test.current.value)

  render() {
    return (
      <div className = "App">
        <input ref = {this.test} />
        <button onClick = {this.handleClick}>Get Value</button>
      </div>
    )
  }
}

Рабочий пример.

Я понимаю, что на это был дан ответ некоторое время назад, но в приведенном вами рабочем примере указано «текущее значение: null». Разве это не должно иметь значение?

Darin Cardin 13.02.2020 23:15

React.createRef () является асинхронным, поэтому, если вы попытаетесь получить доступ к ссылке в componentDidMount, он вернет значение null, а позже вернет свойства компонента, на который вы ссылаетесь.

componentDidMount(): void {
      if (this.viewShot && this.viewShot.current) {
          this.viewShot.current.capture().then((uri) => {
        console.info('do something with ', uri);
          });
      }
  }

Это правильный способ использования React.createRef () в этом контексте.

Вы совершенно не правы! React обновляет все DOM и ссылки до срабатывания componentDidMount. Что такое метод захвата? Он не существует ни для «текущего» элемента в качестве экземпляра ссылки, ни для элемента ввода. Я просто не могу понять, почему так много положительных отзывов. PS: Принятый ответ правильный!

sandbox992 19.03.2021 16:25

Я знаю, что это не решение проблемы OP, но для тех, кто пришел из поиска Google, один из способов, которым ref.current может быть нулевым, заключается в том, что если компонент, к которому прикрепляется ссылка, является подключенным компонентом. Как с react-redux connect или withRouter. Для response-redux решением является передача forwardRef: true в четвертом варианте подключения.

<div ref = {this.test}>

Вы должны назначить опору ref вашему элементу DOM. В этом случае вам нужно присвоить ref элементу div

Что этот ответ добавляет к выбранному ответу?

Sharcoux 08.12.2020 14:18

Это может произойти в следующих случаях:

  • Вы забыли передать свой ссылка компоненту, то есть this.test из вопроса.

<Component ref = {this.test} />

  • Вы используете Redux, в котором компонент, которому передаются реквизиты ссылка, обернут методом connect, и, следовательно, this.test.current вернет ноль, поскольку он указывает на оболочку Redux, чтобы этот вид компонента работал, чтобы forwardRef: true

i.e: connect(mapStateToProps, mapDispatchToProps, null, {forwardRef: true})(Component)

  • Если вы используете withRouter и connect вместе, то вместо один здесь у вас будет дваобертки, и this.test.current, очевидно, вернет ноль, чтобы преодолеть это, убедитесь, что withRouter обертывает connect

withRouter(connect(mapStateToProps, mapDispatchToProps, null, {forwardRef: true})(Component))

а потом

<Component wrappedComponentRef = {ref => this.test = ref} />

wrappedComponentRef - это опора, используемая для того, чтобы сделать обернутый компонент доступным так же, как forwardRef: true, вы можете найти его в документации здесь

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