使用map函数结合innerHTML无法向myContent div添加元素问题
问题原因与修复方案
核心问题1:异步执行顺序错误
axios的请求是异步操作,调用getData()后,代码会立刻执行下面的storeData.map()逻辑,这时候API请求还没返回数据,storeData还是空数组,所以map生成的HTML内容为空,自然不会在页面上显示任何元素。
核心问题2:数据存储格式错误
CoinGecko API返回的res.data本身就是一个包含所有币数据的数组,你用storeData.push(res.data)会把整个数组作为单个元素存入storeData,导致storeData变成二维数组。后续map遍历的时候,每个elem都是完整的数组,访问elem.name、elem.symbol等属性会得到undefined,即使后续执行也无法生成正确的HTML。
修正后的index.js代码
var storeData = [] const getData = () => { axios.get("https://api.coingecko.com/api/v3/coins/markets?vs_currency=usd&order=market_cap_desc&per_page=100&page=1&sparkline=false") .then(res => { // 直接赋值数组,而非push整个数组进去 storeData = res.data; // 在请求成功后再执行DOM渲染逻辑 renderContent(); }) } const renderContent = () => { const myContent = document.querySelector(".myContent"); myContent.innerHTML = storeData.map(elem => { return ` <div class='card'> <div class="card-content"> <h3>${elem.name}</h3> <h3>${elem.symbol}</h3> <h3>$${elem.current_price}</h3> </div> </div> `; }).join(''); // map返回数组,用join转成字符串,避免innerHTML显示逗号 } getData();
额外说明
- 把DOM渲染逻辑放到
renderContent函数里,在API请求成功后调用,确保数据已经拿到再渲染。 - 使用
storeData = res.data直接替换数组,而不是push,保证storeData是一维数组,每个元素是单个币的对象。 - map返回的是数组,用
join('')把数组元素拼接成完整字符串,避免innerHTML插入数组元素间的逗号。
内容的提问来源于stack exchange,提问作者Mayank kumar
相关产品推荐
相关产品推荐

