Vi begynder snart...
Slides køres live i undervisningen
Før ferien
Header.astro
const { title } = Astro.props;
<button>
<slot />
</button>
---
import Card from "../components/Card.astro"
---
<p>{description}</p>
<style>
p { background: red }
</style>
Før ferien
<MainLayout>
<Card title="My Card" />
</MainLayout>
{ title && <h2>{title}</h2> }
├── src/
└── layouts/
---
// JavaScript udenfor browseren
---

Før ferien
---
const artists = await fetch("").then(res => res.json());
---
<ul>
{artists.map((artist) => (
<Card title={artist.title}
img={artist.image.url}
featured={artist.featured}/>
))}
</ul>

Astro
Hvor er vi?
- Hvad består en Astro-component af?
- Hvordan sender vi props?
- Hvor skal vi placere vores styles?
- Hvor lægger vi billeder?
- Hvordan fetcher vi, og hvordan looper vi over data?
- Ved vi, hvad der skal kopieres og rettes i?
Dynamiske routes
I dag
Routing
Statiske routes / fil-baseret
Det, vi gør nu
├── src/
└── pages/
└── index.astro
└── artists.astro
Det, vi gør om lidt
├── src/
└── pages/
└── index.astro
└── artists/
└── index.astro
└── [artist].astro
Dynamisk route / parameter-baseret
Routing
├── src/
└── pages/
└── index.astro
└── artists/
└── index.astro
└── [artist].astro
🤯
Routing
Dynamisk route / parameter-baseret
├── src/
└── pages/
└── index.astro
└── artists/
└── index.astro
└── [artist].astro
Routing

Data som props
Link til undersider
---
const artists = await fetch(url).then(res=>res.json())
---
<ul>
{
artists.map((artist) => (
<Card artist={artist} />
))
}
</ul>
artists/index.astro
---
const { artist } = Astro.props;
---
<li>
<h3>{artist.name}</h3>
<img arc={artist.image} alt={artist.name} />
</li>
Brug props i component
Link til undersider
{ "id": 1, "name": "The Weak-End",
"image": "the-weak-end.webp", "socials": [ { "link": "https://instagram.com", "label": "Instagram" }, { "link": "https://x.com", "label": "X" } ], "spotify_id": "1Xyo4u8uXC1ZmMpatF05PJ", "featured": false, "slug": "the-weak-end", },
components/Card.astro
---
const { artist } = Astro.props;
---
<li>
<h3>{artist.name}</h3>
<img arc={artist.image} alt={artist.name} />
</li>
Brug props i component
Link til undersider
components/Card.astro
{ "id": 1, "name": "The Weak-End",
"image": "the-weak-end.webp", "socials": [ { "link": "https://instagram.com", "label": "Instagram" }, { "link": "https://x.com", "label": "X" } ], "spotify_id": "1Xyo4u8uXC1ZmMpatF05PJ", "featured": false, "slug": "the-weak-end", },
---
const { artist } = Astro.props;
---
<li>
<a href={artist.slug}>
<h3>{artist.name}</h3>
<img arc={artist.image} alt={artist.name} />
</a>
</li>
Brug props i component
Link til undersider
mysite.com/the-weak-end
components/Card.astro
{ ....
"slug": "the-weak-end",
....
}
---
const { artist } = Astro.props;
---
<li>
<a href={`/artists/${artist.slug}`}>
<h3>{artist.name}</h3>
<img arc={artist.image} alt={artist.name} />
</a>
</li>
Brug props i component
Link til undersider
mysite.com/artists/the-weak-end
components/Card.astro
{ ....
"slug": "the-weak-end",
....
}
<a href={"/artists/" + artist.slug}>
Route parameters
Dynamisk underside
├── src/
└── pages/
└── index.astro
└── artists/
└── index.astro
└── [artist].astro
mysite.com/artists/kuntster-navn



Route parameters
[slug].astro
Prøv at skrive noget i adresselinjen og tryk 'Enter'
/film/[slug].astro
SEO
[slug].astro
/film/[slug].astro
kino.dk/film/oensket
kino.dk/biografer/empire-bio
/biografer/[slug].astro
Build time
SSG Mode
Fordi vi skal arbejde med et statisk site, skal Astro på forhånd ("build time") vide, hvilke routes der skal genereres.
getStaticPaths()
SSG Mode
Det gør vi ved at kalde en "magisk" function, der hedder getStaticPaths().
Den skal returnere et array af objekter med en params-egenskab. Hvert af disse objekter vil generere en tilsvarende route.
😵💫
✨
mysite.com/artists/eminem ->
├── src/
└── pages/
└── artists/
└── eminem.astro
Route parameters
mysite.com/artists/eminem ->
├── src/
└── pages/
└── artists/
└── eminem.astro
└── the-weeknd.astro
Route parameters
mysite.com/artists/the-weeknd ->
mysite.com/artists/eminem ->
├── src/
└── pages/
└── artists/
└── eminem.astro
└── the-weeknd.astro
└── ....astro
└── ....astro
Route parameters
mysite.com/artists/the-weeknd ->
mysite.com/artists/... ->
mysite.com/artists/... ->
mysite.com/artists/eminem ->
├── src/
└── pages/
└── artists/
└──
mysite.com/artists/the-weeknd ->
Route parameters
[artist].astro
mysite.com/artists/... ->
mysite.com/artists/... ->
getStaticPaths()
---
export function getStaticPaths() {
return [
{ params: { artist: "eminem" } },
{ params: { artist: "the-weeknd" } }
];
}
const { artist } = Astro.params;
---
<h1>En side om {artist}</h1>
[artist].astro
Returnere et array af objekter
Magisk function
med en params-egenskab
Træk værdien ud af Astro.params
Vis værdien
---
export function getStaticPaths() {
return [
{ params: { artist: "eminem" } },
{ params: { artist: "the-weeknd" } }
];
}
---
artists/[artist].astro
Dette vil generere to sider:
- artists/eminem og
- artists/the-weeknd
getStaticPaths()
getStaticPaths()
med props
---
export function getStaticPaths() {
return [
{ params: { artist: "eminem" }, props { name: "Eminem" } },
{ params: { artist: "the-weeknd" }, props { name: "The Weeknd" } }
];
}
const { artist } = Astro.params;
const { name } = Astro.props;
---
<h1>En side om {name}</h1>
Hent og returner data
---
export function getStaticPaths() {
return [
{ params: { artist: "eminem" }, props { name: "Eminem" } },
{ params: { artist: "the-weeknd" }, props { name: "The Weeknd" } }
];
}
const { artist } = Astro.params;
const { name } = Astro.props;
---
<h1>En side om {name}</h1>
---
export async function getStaticPaths() {
const artists = await fetch(url).then(res=>res.json())
return artists.map(artist => ({
params: { artist: artist.slug }, // [artist]=artist.slug
props: { artist } // send al data med som props
}))
}
const { artist } = Astro.props;
console.log(artist) // artist.name, artist.image osv.
---
<h1>{artist.name}</h1>
Endpoint
Fordi vi await'er
Hent og returner data
---
export async function getStaticPaths() {
const artists = await fetch(url, {
headers: {
apikey: "eyJhb......",
},
}).then(res=>res.json())
return artists.map(artist => ({
params: { artist: artist.slug }, // [artist]=artist.slug
props: { artist } // send al data med som props
}))
}
const { artist } = Astro.props;
console.log(artist) // artist.name, artist.image osv.
---
<h1>{artist.name}</h1>
Supabase nøgle
Copy/Paste Moment
---
export async function getStaticPaths() {
const artists = await fetch(url, {
headers: {
apikey: "eyJhb......",
},
}).then(res=>res.json())
return artists.map(artist => ({
params: { artist: artist.slug }, // [artist]=artist.slug
props: { artist } // send al data med som props
}))
}
const { artist } = Astro.props;
console.log(artist) // artist.name, artist.image osv.
---
<h1>{artist.name}</h1>
Kommer med på GitHub 😬
---
export async function getStaticPaths() {
const artists = await fetch(url, {
headers: {
apikey: import.meta.env.SUPABASE_ANON_KEY,
},
}).then(res=>res.json())
return artists.map(artist => ({
params: { artist: artist.slug }, // [artist]=artist.slug
props: { artist } // send al data med som props
}))
}
const { artist } = Astro.props;
console.log(artist) // artist.name, artist.image osv.
---
<h1>{artist.name}</h1>
læs fra .env
import.meta.env.SUPABASE_ANON_KEY

Lav .env-fil i roden

Lav en nøgle med værdien
Anvend nøglen i dit Astro-projekt


Indsæt variabler i Netlify

Billeder i Supabase

the-weak-end.webp
Billeder i Supabase


<img
src={`/images/${artist.image}`}
alt={artist.name} />
Supabase
Mappestruktur i Astro
Henvisning til billedet
the-weak-end.webp

Tema-opgaven

fetch + map +
[slug].astro
fetch + map + link
Indtil fredag morgen
Projektarbejde og vejledning
🗒️ Husk
- aflevering i morgen
- afprøv links, inden I afleverer
Astro (part 4)
By Dannie Vinther
Astro (part 4)
- 82