Interaktywne wyspy
Kiedy importujemy do plików .astro
komponenty z innych frameworków, musimy zdecydować, czy będą one przekompilowane na statyczny HTML, czy też chcemy zachować ich interaktywną formę. W drugim przypadku, pomogą nam Astro Islands, czyli wyspy!
Counter jako wyspa
Aby zrozumieć jak dziąła taka wyspa, spróbujemy zaimplementować prosty componenty typu Counter w React.js.
Implementacja
- plik
/src/components/Counter.tsx
import { useState } from "react"
const Counter = () => {
const [count, setCount] = useState(0);
return (
<div className="row">
<div className="col text-center mx-auto pt-5 pb-5">
<h1>
<strong>{count}</strong>
</h1>
<h2>✨ Website rating ✨</h2>
<div className="btn-group btn-group-lg">
<button type="button" className="btn btn-danger"
onClick={() => setCount(count - 1)}>
-1
</button>
<button type="button" className="btn btn-success"
onClick={() => setCount(count + 1)}>
+1
</button>
</div>
</div>
</div>
)
}
export default Counter;
- w pliku
/src/pages/index.astro
import Counter from "../components/Counter.tsx";
// ...
<Counter />
Coś się popsuło... Czas na dyrektywę
<Counter client:load/>
<Counter client:visible/>
Dlaczego nazywa się to wyspą?
Kiedy cała strona została przetworzona na HTML, interaktywny komponent pośrodku niej przypomina wyspę.
Inne rodzaje dyrektyw sterujących wyspami
client:visible
- wczytuje JS kiedy komponent jest widoczny w ViewPorcieclient:idle
- wczytuje JS kiedy strona jest już załadowana do przeglądarkiclient:media
- wczytuje JS kiedy zadane media query zostanie spełnione np.client:media="(max-width: 50em)"