I forgårs
Header.astro
const { title } = Astro.props;
<button>
<slot />
</button>
---
import Card from "../components/Card.astro"
---
<p>{description}</p>
<style>
p { background: red }
</style>
I går
<MainLayout>
<Card title="My Card" />
</MainLayout>
{ title && <h2>{title}</h2> }
├── src/
└── layouts/
---
// JavaScript udenfor browseren
---
<img src="/public/images/myImage.webp">

Astro
Hvor er vi?
- Hvad er fordelen ved at bruge en layout-component?
- Hvad er conditional rendering?
- Hvordan navigerer jeg imellem sider i /pages?
- Hvor lægger vi billeder (for nu)?
fetch() & map()
Astro
I dag
Data fetching i Astro
<Card title="Kunstner 1" />
<Card title="Kunstner 2" />
<Card title="Kunstner 3" />
<Card title="Kunstner 4" />
<Card title="Kunstner 5" />
<Card title="Kunstner 6" />
<Card title="Kunstner 7" />
<Card title="Kunstner 8" />
<Card title="Kunstner 9" />
<Card title="Kunstner 10" />
Det, vi gør nu
I dag
Data fetching i Astro
{
artists.map((artist) => <Card title={artist.title} />)
}
Det, vi gør om lidt
fetch(something)
.then(response => response.json())
.then(myFunction)
fetch()
Tema 7
async function getData() {
const response = await fetch("...");
const data = await response.json()
myFunction(data)
}
getData()
fetch()
Alternativ syntaks
---
const response = await fetch("...");
const data = await response.json();
---
fetch()
I Astro får vi lov til...
---
const data = await fetch("...").then(response => response.json());
---
fetch()
... eller som one-liner
---
const data = await fetch("...").then(response => response.json());
console.log(data)
---

fetch()
Log data
---
const data = await fetch("...").then(response => response.json());
console.log(data)
---

fetch()
Log sker på "serveren"
---
const data = await fetch("...").then(response => response.json());
console.log(data)
---

🤯
fetch()
Log sker på "serveren"
---
const now = new Date();
const localTime = now.toLocaleTimeString("da-DK");
console.log(localTime)
---
JavaScript på serveren ("build time")
Bliver logget i terminalen
JavaScript i browseren ("client side")
---
const now = new Date();
const localTime = now.toLocaleTimeString("da-DK");
console.log(localTime)
---
<script>
console.log("Client side")
</script>
Bliver logget i browseren

Bliver logget i terminalen
JavaScript i browseren ("client side")
---
const now = new Date();
const localTime = now.toLocaleTimeString("da-DK");
console.log(localTime)
---
<script>
console.log("Client side")
</script>

Data-rendering
Tema 7
fetch("https://kea-alt-del.dk/t7/api/products")
.then((res) => res.json())
.then((myData) => {
myData.forEach((product) => {
const clone = template.content.cloneNode(true);
const h3 = clone.querySelector("h3");
h3.textContent = product.productdisplayname;
container.appendChild(clone);
});
});
forEach
Data-rendering
Tema 7
forEach
itererer gennem eksisterende elementer og gør noget
Data-rendering
forEach() vs map()
forEach
itererer gennem eksisterende elementer og gør noget
map
itererer over et array og returnerer et nyt, transformeret array
Data-rendering
Generer nye elementer
map
---
const produkter = ;
---
<ul>
{produkter.map((produkt) => (
<li>{produkt}</li>
))}
</ul>
['Æble', 'Banan', 'Citron']
Data-rendering
Astro-magi
---
const produkter = ['Æble', 'Banan', 'Citron'];
---
<ul>
{
}
</ul>
['Æble', 'Banan', 'Citron']
ÆbleBananCitron
Data-rendering
Astro-magi
---
const produkter = ['Æble', 'Banan', 'Citron'];
---
<ul>
{
}
</ul>
[<li>Æble</li>, <li>Banan</li>, <li>Citron</li>]
- Æble
- Banan
- Citron
Nyt, transformeret array
Data-rendering
Astro-magi
---
const produkter = ['Æble', 'Banan', 'Citron'];
---
<ul>
{
produkter.map((produkt) => (
<li>{produkt}</li>
))
}
</ul>
- Æble
- Banan
- Citron
map() itererer over arrayet og returnerer listeelementer
Data-rendering
Astro kan også returnere components
---
const produkter = ['Æble', 'Banan', 'Citron'];
---
<ul>
{
produkter.map((produkt) => (
<Card title={produkt} />
))
}
</ul>
- Æble
- Banan
- Citron
map() itererer over arrayet og returnerer en component
fetch() + map() = 🤩
Data-rendering
Data-rendering
JSON
---
const artists = await fetch("...").then(response => response.json());
---
<ul>
{
artists.map((artist) => (
<Card title={artist.title}
img={artist.image.url}
featured={artist.featured}
/>
))
}
</ul>
øvelse
Fetch og map
Render HTML i browseren på baggrund af et lille datasæt (find øvelsen på Fronter)
Conditional rendering
Vis eller skjul indhold baseret på bestemte betingelser

Conditionals
---
const artists = await fetch("...").then(response => response.json());
---
<ul>
{
artists.map((artist) => (
<Card title={artist.title}
img={artist.image.url}
featured={artist.featured}
/>
))
}
</ul>
---
const { title, img, featured } = Astro.props;
---
<article>
<h2>...</h2>
<img />
</article>
{
}
&&
visible
<p class="featured">Featured artist</p>
Conditionals
---
const { title, img, featured } = Astro.props;
---
<article>
<h2>...</h2>
<img />
</article>
<p class="featured">Featured artist</p>
{
}
&&
visible
Conditionals
---
const { title, img, featured } = Astro.props;
---
<article>
<h2>...</h2>
<img />
</article>
<p class="featured">Featured artist</p>
{
}
&&
featured
Conditionals
---
const { title, img, featured } = Astro.props;
---
<article>
<h2>...</h2>
<img />
</article>
<p class="featured">Featured artist</p>
{
}
&&
featured
Conditionals
hvis featured er sand
---
const { title, img, featured } = Astro.props;
---
<article>
<h2>...</h2>
<img />
</article>
<p class="featured">Featured artist</p>
{
}
&&
featured
Conditionals
vis HTML
---
const { title, img, featured } = Astro.props;
---
<article>
<h2>...</h2>
<img />
</article>
<p class="featured">Featured artist</p>
{
}
&&
featured
Conditionals
(
)
---
const { title, img, featured } = Astro.props;
---
<article class={featured && "featured-artist"}>
<h2>...</h2>
{featured && <p class="featured">Featured artist</p>}
<img />
</article>
Conditionals
Tema-opgaven
Kom i gang

Mandag
I dag
Resten af dagen
Projektarbejde og vejledning
Astro (part 3)
By Dannie Vinther
Astro (part 3)
- 93