Uncaught TypeError: Невозможно прочитать свойство "реквизиты" свойства null
- У меня есть код ответа
- этот код отображает различные панели в пользовательском интерфейсе.
- Когда я нажимаю тег, эта функция называется sportsCornerPanel()
- но я получаю Uncaught TypeError, как его исправить.
- предоставляя код фрагмента ниже.
- весь код вы можете увидеть в скрипке
фрагмент кода
sportsCornerPanel() {
debugger;
console.log("sportsCornerPanel"
console.log("this.props.sportsPanelState.size-->" + this.props);
if (this.props.sportsPanelState.size === 'hidden') {
if (!this.props.sportsPanelState.visible) {
this.props.dispatch(sportsOpenPanel());
} else {
this.props.dispatch(sportsClosePanel());
}
}
}
render() {
let sportsContent, leftNavLink;
if (this.props.sports-layout !== 'small') {
console.log("SportsBox---page loads at bigger size");
console.log("SportsBox---page loads at ipad size");
sportsContent = <SportsBox className="sports-header"/>;
} else {
if (this.props.sportsPanelState.visible) {
console.log("sportsPanelState--when it becomes small--around ipad width");
sportsContent = <SportsBox className="sports-nav"/>;
leftNavLink = <a onClick={this.sportsCornerPanel} href="javascript:;" className="header-navLink active"></a>;
} else {
if (this.props.sports.active) {
console.log("SportsBox");
sportsContent = <SportsBox className="sports-nav"/>;
} else {
console.log("leftNavLink--when it becomes small--around ipad width");
leftNavLink = <a onClick={this.sportsCornerPanel} href="javascript:;" className="header-navLink"></a>;
}
}
}
output
Uncaught TypeError: Cannot read property 'props' of null
Ответы
Ответ 1
Поскольку вы не используете React.createClass
в методах класса this
не ссылается на экземпляр компонента, поэтому вы должны привязать его вручную. Существует несколько способов:
1. Вручную привяжите this
в конструкторе класса
constructor(props) {
super(props);
this.sportsCornerPanel= this.sportsCornerPanel.bind(this);
}
2. Использовать инициализаторы свойств ES7 со стрелкой
sportsCornerPanel = () => {
debugger;
console.log("sportsCornerPanel"
console.log("this.props.sportsPanelState.size-->" + this.props);
if (this.props.sportsPanelState.size === 'hidden') {
if (!this.props.sportsPanelState.visible) {
this.props.dispatch(sportsOpenPanel());
} else {
this.props.dispatch(sportsClosePanel());
}
}
}
3. Привязать this
на сайте
В render()
метод:
let sportsContent, leftNavLink;
if (this.props.sports-layout !== 'small') {
console.log("SportsBox---page loads at bigger size");
console.log("SportsBox---page loads at ipad size");
sportsContent = <SportsBox className="sports-header"/>;
} else {
if (this.props.sportsPanelState.visible) {
console.log("sportsPanelState--when it becomes small--around ipad width");
sportsContent = <SportsBox className="sports-nav"/>;
leftNavLink = <a onClick={this.sportsCornerPanel.bind(this)} href="javascript:;" className="header-navLink active"></a>;
} else {
if (this.props.sports.active) {
console.log("SportsBox");
sportsContent = <SportsBox className="sports-nav"/>;
} else {
console.log("leftNavLink--when it becomes small--around ipad width");
leftNavLink = <a onClick={this.sportsCornerPanel.bind(this)} href="javascript:;" className="header-navLink"></a>;
}
}
}
Ответ 2
Объявите локальную переменную в конструкторе для захвата контекста.
Я столкнулся с той же проблемой при использовании class className extends React.Component
вместо createClass()
. Создайте переменную в конструкторе, чтобы исправить это.
constructor(props) {
super(props);
self = this;
}
Используйте self.props
вместо this.props
везде!
Ответ 3
Похоже, что у вас может отсутствовать метод getDefaultProps
для вашего компонента React. Вы можете рассмотреть нечто подобное, просто чтобы свести на нет ошибку и посмотреть, что еще происходит:
getDefaultProps () { return {}; }
Ответ 4
Привязка метода в конструкторе работала абсолютно нормально.
class Example extends Component {
constructor(props) {
super(props);
this.homeButtonClicked= this.homeButtonClicked.bind(this);
}
}