- Vanilla JS
- CSS
- HTML
2021-05-19 ~ 2021-05-28
-
mobile frame μ λ§κ² app μ μ
-
The maal DB μ random recipe μΆλ ₯
-
μ’μμ λ²νΌμ λλ₯΄λ©΄ favorite meals μ μΆκ°
-
recipe ν΄λ¦ μ, μμΈ μ 보 μΆλ ₯ (
youtube
,ingredients
,details
) -
κ²μμ°½μ (μ: rice) μ λ ₯ μ, ν΄λΉλλ recipe κ²μλ¨
- λΉλκΈ° (async, await μ ν΅ν΄μ getRandomMeal, getMealById, getMEalBySerch) λ₯Ό retun ν¨
async function getRandomMeal() {
const resp = await fetch("https://www.themealdb.com/api/json/v1/1/random.php");
const respData = await resp.json();
const randomMeal = respData.meals[0];
console.log(randomMeal)
addMeal(randomMeal, true);
}
async function getMealById(id) {
const resp = await fetch("https://www.themealdb.com/api/json/v1/1/lookup.php?i=" + id);
const respData = await resp.json();
const meal = respData.meals[0];
return meal
}
async function getMealBySearch(term) {
const resp = await fetch("https://www.themealdb.com/api/json/v1/1/search.php?s=" + term);
const respData = await resp.json();
const meals = respData.meals;
return meals;
}
- like λ²νΌμ λλ₯΄λ©΄ favorite μ°½μ λ©λ΄ μΆκ° νκΈ°
function addMealFav(mealData) {
const favMeal = document.createElement("li");
favMeal.innerHTML = `
<img src="${mealData.strMealThumb}" alt="${mealData.strMeal}">
<span>${mealData.strMeal}</span>
<button class= "clear"><i class="fas fa-window-close"></i></button>
`;
const btn = favMeal.querySelector('.clear');
btn.addEventListener('click', () => {
removeMealLS(mealData.idMeal);
fetchFavMeals();
});
favMeal.addEventListener('click', () => {
showMealInfo(mealData);
});
-
modal μ°½μΌλ‘ youtube, ingredients, details λ±μ API λ‘ λΆν° κ°μ Έμμ ν΄λΉ μ 보λ₯Ό return
-
JS μ κ·μμ ν΅ν΄μ ν΄λΉ youtube URL μμ ν΄λΉλλ ID λΆλΆλ§
match()
λ₯Ό μ¬μ©νμ¬ return
function showMealInfo(mealData) {
// clean it up
mealInfoEl.innerHTML = '';
// update the Meal info
const mealEl = document.createElement('div');
const ingredients = [];
// get ingredients and measures
for(let i=1; i<=20; i++) {
if(mealData['strIngredient' + i]) {
ingredients.push(`${mealData['strIngredient' + i]} - ${mealData['strMeasure' + i]}`)
} else {
break;
}
}
// JS regular expressions (get ID)
const youtubeEl = mealData.strYoutube
const selectURL = youtubeEl.match(/(?<=\=).{1,}/g)
mealEl.innerHTML = `
<h1>${mealData.strMeal}</h1>
<iframe class="video-wrap" width="100%" height="315" src="https://www.youtube.com/embed/${selectURL}" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<h3>Ingredients: </h3>
<ul>
${ingredients.map(ing => `<li>${ing}</li>`).join('')}
</ul>
<p>${mealData.strInstructions}</p>
<img src="${mealData.strMealThumb}" alt="">
`
mealInfoEl.appendChild(mealEl);
// show the popup
mealPopup.classList.remove('hidden')
}
-
λΉλκΈ° κ΄λ ¨ μΈλΆ APIμ μ°κ²° κ΄λ ¨ν΄μ Json μ΄λΌλμ§, λΉλκΈ° κ΄λ ¨ νμ΅λ κ³Ό μλ¬ μ½λκ° λΆλΆμ΄ λ§μμ μ΄λ €μμ λλ
-
ν¨μκ° μ λ¦¬κ° λμ§ μμ λμ€μ clean code λ₯Ό ν΅ν΄ js νμΌ refactoring νμμ± μμ
-
HTML μ½λλ₯Ό μ£Όλ‘ JS μμ innerHTML μ ν΅ν΄μ μμ± νλ κ²μ λν΄μ μ΅μνμ§κ° μμ API μμ dataλ₯Ό κ°μ Έ μ¬ κ²½μ° λ§μ΄ μ¬μ©λκΈ° λλ¬Έμ, λ λ§μ μ°μ΅μ΄ νμ ν κ±° κ°μ
-
κ°μ μ¬ν:
-
λΈλΌμ°μ test μ, μμ΄ν°, μμ΄ν¨λ νκ²½μμ ꡬλμ΄ μ μλλκ² νμΈλ¨ (μ μλλμ§ μΆν κ°μ μμ )
-
λ€μ random μ΄λ―Έμ§ return μ runtimeμ΄ μκ°λ³΄λ€ μ€λ κ±Έλ €μ μ½λ μ΅μ νλ₯Ό ν΅ν ꡬλ μλ ν₯μ νμ
-