Функция, переданная через реквизиты, показаны как неопределенные

У меня есть три компонента: Topicscreen, Listview, Listrow. Я передаю функцию renderrow и два других свойства, определенных в моем Topicscreen в Listview.

Теперь, когда я вызываю func в Listview, реквизиты передаются в Listrow, как определено в функции renderrow, но функция onRowclick, которая передается в Listrow, - это undefined, когда я проверял ее в Listrow.

Как решить эту ошибку и передать onRowclick как функцию в Listrow?

Topicscreen.js

class Topicscreen extends Component {
  constructor() {
    super();
    this.onRowClick = this.onRowClick.bind(this);
  }

  componentDidMount() {
    this.props.dispatch(topicaction.Fetchtopics());
  }

  renderLoading() {
    return <p>Loading...</p>;
  }

  renderrow(rowid, topic) {
    //const selected = this.props.checkselection[rowid]
    const selected = "";
    return (
      <Listrow selected = {selected} clicking = {this.onRowClick} rowid = {rowid}>
        <h3>{topic.title}</h3>
        <p>{topic.description}</p>
      </Listrow>
    );
  }

  onRowClick(rowid) {
    this.props.dispatch(topicaction.selectedchoice(rowid));
  }

  render() {
    if (!this.props.topicsByurl) return this.renderLoading();
    return (
      <div className = "TopicsScreen">
        Hi I am topic screen
        <h1>Choose any three of the below topics</h1>
        <Listview
          rowid = {this.props.topicsurlArray}
          row = {this.props.topicsByurl}
          func = {this.renderrow}
        />
      </div>
    );
  }
}

Listview.js

import React, { Component } from "react";
import _ from "lodash";

export default class Listview extends Component {
  constructor() {
    super();

    this.show = this.show.bind(this);
  }

  show(rowid) {
    return this.props.func(rowid, _.get(this.props.row, rowid));
  }

  render() {
    console.info("props in listview", this.props);
    return (
      <div>
        <ul>{_.map(this.props.rowid, this.show)}</ul>
      </div>
    );
  }
}

Listrow.js

import React, { Component } from "react";

export default class Listrow extends Component {
  clicking() {
    this.props.clicking(this.props.rowid);
  }

  render() {
    console.info("list row called");
    console.info("listrow props", this.props);
    const background = this.props.selected ? "#c0f0ff" : "#fff";
    return (
      <div style = {{ background }} onClick = {this.clicking.bind(this)}>
        {this.props.children}
      </div>
    );
  }
}

Не могли бы вы включить три ваших компонента целиком? Трудно сказать, что может быть не так с кодом, который сейчас находится в вашем вопросе.

Tholle 07.07.2018 14:53

@Tholle добавил код всех компонентов

vaibnak 07.07.2018 15:00
Поведение ключевого слова "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
2
42
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вам также необходимо связать ваш метод renderrow в конструкторе Topicscreen, иначе this.onRowClick внутри renderrow будет не таким, как вы ожидаете.

class Topicscreen extends Component {
  constructor(props) {
    super(props);
    this.onRowClick = this.onRowClick.bind(this);
    this.renderrow = this.renderrow.bind(this);
  }

  // ...
}

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