如何解决:“TypeError:无法读取未定义的属性‘map’”
2019-06-30
102
我正在按照 Redux 教程操作,但一段时间以来一直卡在这个错误上。
我尝试在 StackOverflow 上查找并使用遇到类似问题的人提供的策略,但都不起作用。我尝试调整
index.js
和
App.js
中的代码,以更好地定位“艺术家”。我还仔细检查了我的语法,以确保我正确地定位了所有内容,但什么都不起作用。
有人能帮我了解这个错误来自哪里以及如何修复它吗?
如果有帮助,下面列出了我正在遵循的教程的链接。第 8 步是我特别卡住的部分。 https://www.youtube.com/watch?v=DiLVAXlVYR0&t=3s
另外,这是我的 GitHub Repo,以防下面的代码不足以解释问题: https://github.com/adimacci95/K-Profiles
Artist-List.js
import React, { Component } from 'react';
// import { bindActionCreators } from 'redux';
import { connect } from 'react-redux';
class artistList extends Component {
createArtistList() {
return this.props.artist.map((artist) => {
return (
<div className="card" key={artist.id}>
Hello
<div className="card-image">
<img src={artist.img} alt={artist.stagename}/>
</div>
</div>
);
});
}
render() {
return (
<div className="container">
{this.createArtistList()}
</div>
);
}
}
function mapStateToProps(state) {
return {
artist: state.artist
};
}
export default connect(mapStateToProps)(artistList);
App.js
import React from 'react';
import Navbar from './components/Navbar/navbar.js';
import {BrowserRouter, Route, Switch} from 'react-router-dom'
import artistList from './pages/ArtistList/artist-list.js';
const App = () => (
<div className="App">
<BrowserRouter>
<Navbar/>
<Switch>
<Route path="/artists" component={artistList}/>
</Switch>
</BrowserRouter>
</div>
);
export default App;
Index.js
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import { createStore } from 'redux';
import { Provider } from 'react-redux';
import { BrowserRouter } from 'react-router-dom';
import allArtists from './reducers/reducers.js';
const store = createStore(allArtists);
ReactDOM.render(
<Provider store={store}>
<BrowserRouter>
<App />
</BrowserRouter>
</Provider>,
document.getElementById('root'));
2个回答
简而言之,React 组件在从
redux-store/mapStateToProps
检索任何数据之前会进行一次
render
。
您当前正在对尚不存在的数组执行
.map()
。即:尚未从 props 收集任何数据。
在
createArtistList()
中,您应该在调用
.map()
之前验证是否确实存在数据。只需运行类似以下检查:
createArtistList() {
const artists = this.props.artist
if(artists && artists.length > 0){
return artists.map((artist) => {
return (
<div className="card" key={artist.id}>
Hello
<div className="card-image">
<img src={artist.img} alt={artist.stagename}/>
</div>
</div>
);
}
} else {
return "Loading..."
}
}
Cat_Enthusiast
2019-06-30
最简单的解决方案是将
map
函数写入
render
中,
import React, { Component } from 'react';
// import { bindActionCreators } from 'redux';
import { connect } from 'react-redux';
class artistList extends Component {
render() {
return (
<div className="container">
{this.props.artist.length > 0 && this.props.artist.map((artist) => (
<div className="card" key={artist.id}>
Hello
<div className="card-image">
<img src={artist.img} alt={artist.stagename}/>
</div>
</div>
);
)}
</div>
);
}
}
function mapStateToProps(state) {
return {
artist: state.artist
};
}
export default connect(mapStateToProps)(artistList);
另一种方法是,如果您只想使用该函数,则使用 隐式返回 ,
createArtistList() {
if(this.props.artist.length > 0){
return this.props.artist.map((artist) => (
<div className="card" key={artist.id}>
Hello
<div className="card-image">
<img src={artist.img} alt={artist.stagename}/>
</div>
</div>
);
)
} else {
return "Loading..."
}
}
ravibagul91
2019-07-01