React运行报TypeError: this.state.albumlist.map is not a function求排查
报错根因
TypeError: this.state.albumlist.map is not a function 出现的核心原因是 this.state.albumlist 不是数组类型,只有数组才拥有map方法。你的代码中存在多处语法错误和逻辑疏漏,最终导致albumlist赋值失败或被赋值为非数组值,排查点如下:
一、必须修复的语法错误
这些错误会直接导致代码无法正常执行,状态赋值失效:
- 构造函数中
state初始化缺少等号:
错误写法:this.state {
正确写法:this.state = { loadAlbums异步方法定义语法错误,缺少赋值等号:
错误写法:loadAlbums async () => {
正确写法:loadAlbums = async () => {- 导入的
datasource大小写不匹配:导入时是小写datasource,但loadAlbums中调用用了大写开头的dataSource,变量名不统一会抛出未定义错误 - 搜索请求的字符串拼接错误:
错误写法:datasource.get('album/search/description/" + phrase);
单引号开头却用双引号拼接,还多了一行无意义的+符号,正确写法为:datasource.get(album/search/description/${phrase})(模板字符串写法,更清晰) - 方法名大小写、拼写不匹配:你定义的渲染列表方法名存在空格、大小写混乱问题,调用时却写的是
this.renderedlist(),建议统一修改为renderedList,定义和调用保持一致 render方法中return直接换行:JS语法会自动在单独的return后插入分号,相当于返回undefined,需要将根JSX元素和return写在同一行,或者用括号包裹JSX结构map方法的括号位置错误:
错误写法:this.state.albumlist.map (album) => {
正确写法:this.state.albumlist.map((album) => {
二、接口返回值兼容处理
语法修复完成后如果仍报错,需要处理接口返回值的异常情况:
- 先查看控制台中
console.log(response.data)的输出,确认返回的结果是不是纯数组。很多后端接口会将数据放在嵌套结构中,比如返回{code: 200, data: [数组内容], msg: 'success'},此时你需要改为取response.data.data赋值给albumlist - 增加兜底逻辑,避免接口返回非数组时直接报错:
不管是初始化加载还是搜索请求,赋值albumlist时都做数组判断:this.setState({albumlist: Array.isArray(response.data) ? response.data : []})
修复后的完整参考代码
import React from "react"; import datasource from "./dataSource"; import Card from "./Card"; import "./App.css"; import SearchForm from "./SearchForm"; class App extends React.Component { constructor(props) { super(props); this.state = { albumlist: [], searchphase: "" }; } componentDidMount() { this.loadAlbums(); } loadAlbums = async () => { const response = await datasource.get("/album"); // 加数组兜底判断 const list = Array.isArray(response.data) ? response.data : []; this.setState({albumlist: list}); console.log(list); } updateSearchResults = async (phrase) => { console.log("phrase", phrase); this.setState({searchphase: phrase}); const response = await datasource.get(`album/search/description/${phrase}`); // 加数组兜底判断 const list = Array.isArray(response.data) ? response.data : []; this.setState({albumlist: list}); } renderedList = () => { return this.state.albumlist.map((album) => { return ( <Card key = {album.ID} albumtitle={album.TITLE} albumDescription={album.DESCRIPTION} imgurl={album.IMAGE_NAME} buttonText="Buy Now" /> ); }) }; render() { // return后面加括号包裹JSX,避免自动插入分号 return ( <div> <div className="container"> <SearchForm onSubmit={this.updateSearchResults} /> </div> <div className="container"> {this.renderedList()} </div> </div> ); } } export default App;
内容的提问来源于stack exchange,提问作者goodmaker
相关产品推荐
相关产品推荐

