nextjsでzustandライブラリを使ってfetch APIを叩いてみた~スケルトンローディングを添えて~
こんにちわ。nap5です。
nextjsでzustandライブラリを使ってfetch APIを叩いてみたので、紹介したいと思います。
Twitterにも投稿してみました。
zustandライブラリはこちらです。
デモコードです。
デモサイトです。
zustandでは以下のようにfetch APIをフック化して使うことができるようになります。
import create from 'zustand';
const useBebop = create((set) => {
return {
data: null,
setData: async ({message}) => {
console.log(`message`, message);
const response = await fetch('/api/hello');
const {data} = await response.json();
set((state) => {
state.data = data;
});
},
};
});
export default useBebop;
呼び出し側では以下のように使います。
const Home = ({pageName, notifier}) => {
const {data, setData} = useBebop((state) => {
return {
setData: state.setData,
data: state.data,
};
});
return (
<Layout pageName={pageName} notifier={notifier}>
<section
className={css`
max-width: 1200px;
margin: auto;
width: 100%;
min-height: 100vh;
display: flex;
justify-content: flex-start;
align-items: center;
flex-direction: column;
`}
>
<h2>HomePage</h2>
<Button
colorScheme={'blue'}
onClick={(e) => {
if (data === null) {
setData({message: 'bebop'});
} else {
console.log(`used cache`);
}
}}
>
Fetch
</Button>
<Grid gutter={`1rem`} data={data} />
<p>something...</p>
<p>something...</p>
<p>something...</p>
</section>
</Layout>
);
};
export default Home;
nextjsでImageを使うときはサイズのカスタマイズハンドリングが若干難しく、以下の記事を参考にしてデモのようなレイアウトを達成しました。
最近では、MENTAをはじめてみました。MENTAを使って提供していることを紹介している記事は以下になります。
また、Twitterでモックアップ動画を公開しているので、こちらもよかったら、覗いてみてください。
最後に、Udemyでコースを公開しました。
良かったら覗いてみてください。
https://www.udemy.com/course/count-down-up-using-javascript-animation-api/
また、コースの内容紹介記事は以下になります。
簡単ですが、以上です。
この記事が気に入ったらサポートをしてみませんか?