#reactjs
#reactjs
Вопрос:
Каждый раз, когда я использую функцию map с axios, я получаю следующую ошибку.
Ошибка типа: не удается прочитать свойство ‘map’ неопределенного
Код реакции для вызова API:
import React ,{Component} from 'react'
import axios from 'axios'
class Api extends Component{
state={
content :[]
}
componentDidMount =()=>{
axios.get('js/data.json').then(res=>{this.setState({content : res.data.content})
console.log(this.state.content)})
}
render(){
const items=this.state.content ;
const thecontain= items.map((item)=>{
return(
<div>
<p>{item.name}</p>
</div>
)
})
return(
<div>{thecontain}</div>
)}
}
export default Api
Комментарии:
1. не могли бы вы, пожалуйста, предоставить результат ответа API в описании?
2. Являются ли «элементы» массивом? если нет, то произойдет следующее «Не удается прочитать свойство ‘map’ из неопределенного».
3. @AbuSufian На самом деле это выдаст эту ошибку, только если
items
значение не определено. Если оно определено, но с другим типом данных, оно скажет что-то вродеmap
не является функцией или не существует. Скорее всего,res.data.content
оно не определено в ответе axios, поэтому значение состояния задается из пустого массива, чтобыundefined
затем выдать ошибку.4. «items» — это пустой массив, в который я поместил данные в свой json-файл и определил его
5. @BrianThompson итак, как мне следует выполнить функцию setstate?
Ответ №1:
В общем, одна из причин, по которой TypeError
выдается ошибка, заключается в том, что вы пытаетесь выполнить метод, несовместимый с типом this.state.content
из ошибки в вашем вопросе, если он выдается отсюда, то это означает, что вы пытаетесь получить доступ к карте из неопределенного типа, который в общем случае не существует. map
это прототип метода, который присутствует в массивах, поэтому проверьте, является ли this.state.content
array или нет, если array использует его, если нет, по умолчанию это array, чтобы вы не получили ошибку типа, если вопрос TypeError
from отсюда. Было бы ясно, если бы трассировка стека была включена в вопрос.
const items=Array.isArray(this.state.content)? this.state.content:[];
const thecontain= items.map((item)=>{
return(
<div>
<p>{item.name}</p>
</div>
)
})
return(
<div>{thecontain}</div>
)
}
Комментарии:
1. на самом деле никаких ошибок не появляется, данные тоже не отображаются
2. что означает «помещенные данные тоже не отображаются»
3. Мне интересно, почему вы используете axios для извлечения файла в вашем локальном каталоге
4.Это не решает проблему, это просто усложняет поиск проблемы. Они инициализировали
this.state.content
пустой массив, поэтому проверка того, что это массив, не решит проблему. Проблема связана с тем, что оноthis.state.contents
становится неопределенным позже в цикле.5. «Ошибка указывает на то, что вы пытаетесь получить доступ к свойству / методу, который не существует», это просто неправда. Это указывает на то, что
items
(тем самымthis.state.content
) являетсяundefined
.
Ответ №2:
render(){
const items=this.state.content;
let thecontain = null;
if(typeof this.state.content === 'object'){
if(this.state.content.constructor.name == "Array"){
thecontain= items.map((item)=>{
return (
<div>
<p>{item.name}</p>
</div>
)
})
}
}
return(
<div>{thecontain}</div>
)
}
Комментарии:
1. пожалуйста, проверьте
items
значение массива. может быть, это [], т. е. там нет элемента.2. items — это мой файл json, в нем есть данные
3. @HossamThapet я обновил свой ответ. проблема заключалась в проверке типа array . исправлено с помощью
if(this.state.content.constructor.name == "Array")
4. Array.isArray() — нет необходимости заходить в конструктор..