Реагировать, передавая опору компонентам, возвращать undefined

Я действительно не понимаю, почему, когда я направляю на http: // localhost: 3000 / предметы / физика моего проекта.

Переменная GradeSelection определена в состоянии App.js. Он передается компоненту subjectCards.js через реквизиты как gradeSelection, который передает его компоненту Subject.js через реквизиты как gradeSelection.

Однако this.props.gradeSelection в Subjects.js возвращает значение undefined.

Возможно, я что-то делаю не так?

Вывод в консоль:

App.js: Year 12             // correct
subjectCards.js: Year 12    // correct
Subject.js: undefined       // not correct

App.js

constructor(props) {
  super(props);
  this.state = {
    gradeSelection: "Year 12"
  };
}

render() {
  console.info("App: "+this.state.gradeSelection)
  return (
    <Route path = "/subjects" render = {(props)=>(<SubjectCards {...props}  gradeSelection = {this.state.gradeSelection} />)} />
);


}

subjectCards.js

let display;

console.info("subjectCards.js: "+props.gradeSelection)
display = <Route path = "/subjects/:subjectName" render = {(props)=><Subject {...props} gradeSelection = {props.gradeSelection}/>} />


return (
  display
);

Subject.js

constructor(props) {
  super(props);
  console.info("Subject.js: "+this.props.gradeSelection);  // undefined
}

Спасибо!

Обновлено:

Когда console.info (props) или console.info (this.props) в конструкторе Subjects.js. GradeSelection внутри вывода консоли все еще не определено.

Я пробовал передать строку в gradeSelection в subjectCards.js, и вывод консоли был правильным при возврате строки в Subject.js ..

display = <Route path = "/subjects/:subjectName" render = {(props)=><Subject {...props} gradeSelection = {"props.gradeSelection"}/>} />

вы пробовали регистрировать это внутри метода componentDidMount, а не конструктора?

quirimmo 22.11.2018 03:13

Думаю это аналогичная проблема stackoverflow.com/questions/41496655/…

Eric Marcelino 22.11.2018 03:13

заменить this.props.gradeSelection на props.gradeSelection

Randy Casburn 22.11.2018 03:14
Поведение ключевого слова "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) для оценки ваших знаний,...
8
3
9 078
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Как сказал Рэнди Касберн в комментариях, вы должны ссылаться на props.gradeSelection, а не на this.props.gradeSelection.

Props принимается в качестве входных данных для вашей функции-конструктора (например, constructor(props)), и поэтому на него следует ссылаться как на таковой. Если вам нужно манипулировать им перед рендерингом или управлять им локально, вы можете передать это состояние для Subject в конструкторе.

Когда console.info (props), gradeSelection все еще не определен. Будет ли какая-то другая причина, по которой он не определен?

tom_son 22.11.2018 03:51

Прочитав код более внимательно, кажется, что вы перезаписываете имя переменной «prop» - это область действия функции в subjectCard: display = <Route path = "/subjects/:subjectName" render = {(props)=><Subject {...props} gradeSelection = {props.gradeSelection}/>} />. Реквизиты, передаваемые компоненту Subject, - это реквизиты, определенные в вызове функции, а не переданные реквизиты. в subjectCard.js.

Mike 22.11.2018 04:10

Вы можете использовать как:

//subjectCards.js
render = {({gradeSelection, ...other}) => <Subject {...other} 
      gradeSelection = {gradeSelection}/>}

//Subject.js
console.info(props.gradeSelection)

Но подождите, вы можете просто передать реквизит, в нем есть все, что вам нужно (включая GradeSelection):

//subjectCards.js
render = {(props) => <Subject {...props} />}

//Subject.js
console.info(props.gradeSelection)
Ответ принят как подходящий

Не видя остальной части вашего кода, я предполагаю, что subjectCards.js - это функциональный компонент, который выглядит следующим образом. Если нет, не могли бы вы опубликовать полный компонент?

function SubjectCards(props) {
  let display

  console.info('subjectCards.js: ' + props.gradeSelection)

  display = (
    <Route
      path = "/subjects/:subjectName"
      render = {props => (
        <Subject {...props} gradeSelection = {props.gradeSelection} />
      )}
    />
  )

  return display
}

Что я вижу неправильным в этом коде в вашем конкретном случае использования, так это то, что в строке 1 у вас есть аргумент с именем props. Если вы проследите код до строки 9, вы заметите, что вызов анонимной функции внутри render также имеет аргумент props. В строке 10 вы вызываете props.gradeSelection, который просматривает аргумент, найденный в строке 9, а не аргумент, найденный в строке 1, давая вам undefined.

Есть несколько способов исправить это. Один из способов, который я бы порекомендовал, - это деструктуризация ваш аргумент props в строке 1.

function SubjectCards({ gradeSelection }) { // See how we went from props to {gradeSelection}
  let display

  console.info('subjectCards.js: ' + gradeSelection)

  display = (
    <Route
      path = "/subjects/:subjectName"
      render = {props => <Subject {...props} gradeSelection = {gradeSelection} />}
    />
  )

  return display
}

Вы можете увидеть пример этого на https://mo9jook5y.codesandbox.io/subjects/math

Вы можете поэкспериментировать с примером здесь: https://codesandbox.io/s/mo9jook5y

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