#reactjs #express
#reactjs #выразить
Вопрос:
Я новичок в react, я использую пакет create-react-app и экспресс-генератор. Кажется, я не могу отобразить компонент react из-за неопределенного свойства, которое я не вижу, чтобы понять, почему оно не определено? Вот мой код:
index.js
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import PageContent from './App';
import * as serviceWorker from './serviceWorker';
const pageContent = new PageContent();
ReactDOM.render(
<React.StrictMode>
<pageContent.App />
</React.StrictMode>,
document.getElementById('root')
);
// If you want your app to work offline and load faster, you can change
// unregister() to register() below. Note this comes with some pitfalls.
serviceWorker.unregister();
App.js
import React from 'react';
import logo from './logo.svg';
import './App.css';
class PageContent extends React.Component {
constructor(props) {
super(props)
this.state = {
apiResponse: 'test test test'
};
}
callAPI() {
fetch("http://localhost:3127/testAPI")
.then(res => res.text())
.then(res => this.setState({ apiResponse: 'hello' }));
}
componentWillMount() {
this.callAPI();
}
App() {
return (
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<p>
Edit <code>src/App.js</code> and save to reload.
</p>
<a
className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer"
>
Learn React
</a>
<p className="App-intro">**{PageContent.state.apiResponse}</p>
</header>
</div>
);
}
}
export default PageContent;
Это ошибка, которую я получаю:
TypeError: Cannot read property 'apiResponse' of undefined
App
src/App.js:39
36 | >
37 | Learn React
38 | </a>
> 39 | <p className="App-intro">**{PageContent.state.apiResponse}</p>
40 | ^ </header>
41 | </div>
42 | );
Спасибо всем за помощь
Ответ №1:
Вы хотите использовать:
{this.state.apiResponse}
Редактировать: я заметил, что вы отображаете метод App непосредственно после создания экземпляра класса PageContent . Вам не нужно этого делать. Вы можете просто переименовать App()
метод в be render()
, затем удалить const pageContent = new PageContent();
и затем можно выполнить рендеринг <PageContent />
вместо <pageContent.App />
.
Комментарии:
1. К сожалению, я попробовал это и получил эту ошибку: ‘TypeError: не удается прочитать свойство ‘состояние’ неопределенного’
2. О, я вижу, вы напрямую ссылаетесь на метод приложения. Я обновлю свой ответ.
3. Работает как шарм! большое вам спасибо! Не могли бы вы объяснить, почему это не работало раньше, и оно работает сейчас?
4. Когда у вас есть
<PageContent />
react, он в основном создает его для вас, потому что это класс. Если у вас есть<pageContent.App />
, это просто функция, и она будет отображаться как функциональный компонент, но с ним не связано состояние.5. Приятно! Итак, чего мне не хватало, так это того, что react создает экземпляр класса для меня при рендеринге? Или в любом случае?
Ответ №2:
Вы допускаете 2 ошибки —
-
сначала запишите его как
{this.state.apiResponse
} -
Ваш app.js файл записан неправильно, он должен быть примерно таким
import React from 'react';
import logo from './logo.svg';
import './App.css';
export default class PageContent extends React.Component {
constructor(props) {
super(props)
this.state = {
apiResponse: 'test test test'
};
}
callAPI() {
fetch("http://localhost:3127/testAPI")
.then(res => res.text())
.then(res => this.setState({ apiResponse: 'hello' }));
}
componentWillMount() {
this.callAPI();
}
render() {
return (
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<p>
Edit <code>src/App.js</code> and save to reload.
</p>
<a
className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer"
>
Learn React
</a>
<p className="App-intro">{this.state.apiResponse}</p>
</header>
</div>
);
}
}
после этого импортируйте этот PageContent в свой index.js вот так —
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import PageContent from './App';
import * as serviceWorker from './serviceWorker';
ReactDOM.render(
<React.StrictMode>
<PageContent />
</React.StrictMode>,
document.getElementById('root')
);
// If you want your app to work offline and load faster, you can change
// unregister() to register() below. Note this comes with some pitfalls.
serviceWorker.unregister();
Комментарии:
1. Привет, то же, что я уже отвечал ранее: к сожалению, я попробовал и получил эту ошибку: ‘TypeError: не удается прочитать свойство ‘состояние’ неопределенного’
2. @BarakBensimhon напишите это так. Я отредактировал ответ.