3 回答

TA貢獻1871條經驗 獲得超13個贊
你有卡片作為一個對象,而你需要的東西就在這個對象內部。輸出部分也是錯誤的,你沒有card變量。所以,
function Mtg() {
fetch("https://api.magicthegathering.io/v1/cards")
.then((res) => res.json())
.then(({cards}) => { // destruct cards from object
let output = "";
cards.forEach((card) => {
output += `
<div>${card.name}</div>
<div>${card.imageUrl}</div>
`
});
document.getElementById("mtgCardsContainer").innerHTML = output;
});
}

TA貢獻1816條經驗 獲得超4個贊
您的邏輯是正確的,您只是稍微偏離了響應的正確部分......
當您發出 fetch 請求時,您將返回一個 JSON 對象。您已選擇為該對象卡命名。
在本例中,JSON 對象返回一個名為“cards”的對象,該對象本身包含一個也稱為“cards”的數組,因此為了訪問該數組,您需要定位以下內容:
cards.cards.forEach((item, index) => {
console.log(item)
});
為了使您的代碼更具可讀性并減少混亂,您可能希望更改與返回的 JSON 對象相關的卡片變量的名稱......
.then((data) => {
let output = "";
data.cards.forEach((item, index) => {
console.log(item)
output += `
<div>${item.name}</div>
<div>${item.imageUrl}</div>
`
});
...
});

TA貢獻1911條經驗 獲得超7個贊
進行了一些重構并添加了一些評論。祝你好運:
/**
*
* @param card {Object}
* @returns {string} as HTML
*/
const cardTemplateHTML = (card) => {
return `
<div>${card.name}</div>
<div>${card.imageUrl}</div>
`
};
/**
*
* @param cards {Object}
*/
const renderCards = ({cards}) => { /*
note: your currently inject the object data that contains cards. So by using the modern syntax { cards }
you don't have to write 'const {cards} = data' or 'const cards = data.cards'
*/
const mtgCardsContainer = document.getElementById("mtgCardsContainer");
//generate HTML
const cardsHTML = cards.map(card => {
//generete the HTML for every entry
return cardTemplateHTML(card)
})
//merge the list together into one string
.join('');
//update DOM
mtgCardsContainer.innerHTML = cardsHTML;
}
const Mtg = () => {
// make fetch promise
fetch("https://api.magicthegathering.io/v1/cards")
//fetch result, returns new promise
.then((res) => res.json())
//fetch result, returns the rendered json data
.then((data) => renderCards(data)); /* return data example: data = { cards } */
}
//Load
document.addEventListener("DOMContentLoaded", Mtg);
<div id="mtgCardsContainer">
</div>
添加回答
舉報