Slides køres live i undervisningen
Header.astro
const { title } = Astro.props;
<button>
<slot />
</button>
---
import Card from "../components/Card.astro"
---
<p>{description}</p>
<style>
p { background: red }
</style>
<MainLayout>
<Card title="My Card" />
</MainLayout>
{ title && <h2>{title}</h2> }
├── src/
└── layouts/
---
// JavaScript udenfor browseren
---
---
const artists = await fetch("").then(res => res.json());
---
<ul>
{artists.map((artist) => (
<Card title={artist.title}
img={artist.image.url}
featured={artist.featured}/>
))}
</ul>
Hvor er vi?
Dynamiske routes
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
├── src/
└── pages/
└── index.astro
└── artists/
└── index.astro
└── [artist].astro
Dynamisk route / parameter-baseret
├── src/
└── pages/
└── index.astro
└── artists/
└── index.astro
└── [artist].astro
Data som props
---
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
{ "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
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
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
mysite.com/artists/the-weak-end
components/Card.astro
{ ....
"slug": "the-weak-end",
....
}
<a href={"/artists/" + artist.slug}>
Route parameters
├── src/
└── pages/
└── index.astro
└── artists/
└── index.astro
└── [artist].astro
mysite.com/artists/kuntster-navn
Route parameters
Prøv at skrive noget i adresselinjen og tryk 'Enter'
/film/[slug].astro
SEO
/film/[slug].astro
kino.dk/film/oensket
kino.dk/biografer/empire-bio
/biografer/[slug].astro
Build time
Fordi vi skal arbejde med et statisk site, skal Astro på forhånd ("build time") vide, hvilke routes der skal genereres.
getStaticPaths()
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
mysite.com/artists/eminem ->
├── src/
└── pages/
└── artists/
└── eminem.astro
└── the-weeknd.astro
mysite.com/artists/the-weeknd ->
mysite.com/artists/eminem ->
├── src/
└── pages/
└── artists/
└── eminem.astro
└── the-weeknd.astro
└── ....astro
└── ....astro
mysite.com/artists/the-weeknd ->
mysite.com/artists/... ->
mysite.com/artists/... ->
mysite.com/artists/eminem ->
├── src/
└── pages/
└── artists/
└──
mysite.com/artists/the-weeknd ->
[artist].astro
mysite.com/artists/... ->
mysite.com/artists/... ->
---
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:
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>
---
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
---
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
the-weak-end.webp
<img
src={`/images/${artist.image}`}
alt={artist.name} />
Supabase
Mappestruktur i Astro
Henvisning til billedet
the-weak-end.webp
fetch + map +
[slug].astro
fetch + map + link
Projektarbejde og vejledning
🗒️ Husk