Аргументы не определены после перехода к функции React?

В компоненте Home мы хотим вызвать функцию:

     refreshMatchStatus = (match_id, status) => {
       console.info(match_id)
       var matches = this.state.matches
       matches.map(function(match){
         if (match.id == match_id){
           match.challenged = status
         }
       })
       this.setState({matches: matches})
     }

Из главного рендера эта функция передается следующему компоненту:

 <List refreshMatchStatus = {this.refreshMatchStatus.bind(this)} showAlert = {this.props.showAlert} user = {this.state.user} token = {this.state.token} matches = {this.state.matches}/>

Затем функция передается через некоторые компоненты, например:

refreshMatchStatus = {this.props.refreshMatchStatus} 

Когда он поступает в компонент ChallengePopup, он выполняется следующим образом:

this.props.refreshMatchStatus(match_id, status)

По какой-то причине аргументы match_id и status передаются как undefined.

Если мы выполним console.info в компоненте ChallengePopup, за одну строку до вызова функции, match_id вернет правильный номер идентификатора. Но когда мы выполняем console.info в первой строке функции refreshMatchStatus, match_id возвращает undefined.

Мы подозреваем, что это как-то связано с bind (this), но мы не можем найти способ передать аргументы правильным образом.

Вы должны показать код компонента, который содержит <List refreshMatchStatus = {this.refreshMatchStatus.bind(this)} ...>

Gabriele Petrioli 19.03.2018 13:33

вы можете опубликовать полный код всех соответствующих компонентов / функций?

Yossi 19.03.2018 13:34

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

Abslen Char 19.03.2018 13:36

используйте используемую стрелочную функцию между ними при передаче этой функции вниз

Shubham Khatri 19.03.2018 13:45

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

Ruben Serrate 19.03.2018 13:45

Вы, должно быть, пропустили проблему в своем коде где-либо на пути, который вы не добавляли здесь. Это не воспроизводится. См. Созданный мной минимальный пример codeandbox.

trixn 19.03.2018 14:23

Не могли бы вы добавить полный код компонента ChallengePopup, который вызывает обработчик? Проблема не в предоставленном вами коде.

trixn 19.03.2018 15:22

@RubenSerrate спасибо, что решили проблему! Если вы добавите это в качестве ответа, я могу принять это. Все еще сложно понять, когда мне нужно использовать функции привязки и стрелок

kajdehoop 19.03.2018 19:27
Поведение ключевого слова "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) для оценки ваших знаний,...
2
8
2 459
1

Ответы 1

Переместите вызов привязки в конструктор, например.

constructor(props) {
    super(props);
    this.refreshMatchStatus = this.refreshMatchStatus.bind(this);
}

Затем вы можете удалить вызов .bind в своем методе рендеринга, иначе, поскольку он является родительским компонентом, каждый раз, когда запускается новый рендеринг, привязка метода сбрасывается, что, как я считаю, может привести к потере аргументов от дочерних элементов.

Перемещение привязки к конструктору - хорошая идея, но я не понимаю, как это приведет к потере параметров.

Ruben Serrate 19.03.2018 13:41

В конце его вопроса говорится: «Мы подозреваем, что это может иметь какое-то отношение к привязке», поэтому я предлагаю альтернативный метод и позволяю им самим определить :)

Joshua Underwood 19.03.2018 13:42

Да, да, ваш ответ имеет ценность, просто любопытно, почему / как это повлияет!

Ruben Serrate 19.03.2018 13:42

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