いつも大変お世話になっております。
現在Nextを利用してworpdressからRESTを利用して記事情報を取得しようとしています。
記事一覧にアクセスした際に10件分の記事情報を取得し、
記事情報は Context でグローバル管理をし、記事詳細ページで使い回しをしたいと考えています。
一応自分の方でそれっぽいソースを記述してみたのですが、
何度もサーバー側にリクエスト処理がかかってしまい(ループ処理のように)、
自分の考えているように動作してくれません。
今回の質問の着地地点としては、「REST APIで取得したデータをContext APIで管理をする」です。
どなたかわかる方がいらっしゃればご教授いただけますと幸いです。
それではどうぞ宜しくお願い致します。
ソースコード
bash
1# 使用しているファイルのみ記載 2. 3├── contexts 4│ └── PostsContext.jsx 5└── pages 6 ├── _app.js 7 ├── api 8 └── index.js
javascript
1 2# context/PostsContext.jsx 3 4import {createContext, useState} from "react"; 5 6const PostsContext = createContext({}); 7 8const PostsProvider = ({children}) => { 9 10 const [posts, setPosts] = useState({}) 11 12 const fetchPosts = async () => { 13 try { 14 15 const res = await fetch('xxxxxxx/wp-json/wp/v2/posts'); 16 const posts = await res.json(); 17 18 setPosts(posts); 19 20 } catch (err) { 21 console.error(err); 22 } 23 }; 24 25 return ( 26 <PostsContext.Provider value={{posts, fetchPosts}}> 27 {children} 28 </PostsContext.Provider> 29 ) 30 31} 32 33export {PostsContext, PostsProvider}; 34
javascript
1 2# pages/_app.js 3 4import '../styles/globals.css' 5import {PostsProvider} from "../contexts/PostsContext"; 6 7function MyApp({Component, pageProps}) { 8 return ( 9 <PostsProvider> 10 <Component {...pageProps} /> 11 </PostsProvider> 12 ) 13} 14 15export default MyApp
javascript
1 2# pages/index.js 3 4import Head from 'next/head' 5import {useContext} from "react"; 6import {PostsContext} from "../contexts/PostsContext"; 7 8export default function Home() { 9 10 const {posts, fetchPosts} = useContext(PostsContext); 11 12 fetchPosts(); 13 14 console.log(posts); 15 16 return ( 17 <></> 18 ) 19} 20
# 修正後ソース
javascript
1 2# context/PostsContext.jsx 3 4import {createContext, useState} from "react"; 5import {useEffect} from "react"; 6 7 8const PostsContext = createContext({}); 9 10const PostsProvider = ({children}) => { 11 12 const [posts, setPosts] = useState({}) 13 14 useEffect(async () => { 15 16 const res = await fetch('xxxxxxx/wp-json/wp/v2/posts'); 17 const posts = await res.json(); 18 19 setPosts(posts); 20 21 }, [setPosts]) 22 23 return ( 24 <PostsContext.Provider value={{posts}}> 25 {children} 26 </PostsContext.Provider> 27 ) 28 29} 30 31export {PostsContext, PostsProvider}; 32
javascript
1 2# pages/index.js 3 4import Head from 'next/head' 5import {useContext} from "react"; 6import {PostsContext} from "../contexts/PostsContext"; 7 8export default function Home() { 9 10 const {posts} = useContext(PostsContext); 11 12 console.log(posts); 13 14 return ( 15 <></> 16 ) 17}
出力
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/22 13:29
2021/11/22 13:49
2021/11/23 04:21
2021/11/23 04:41
2021/11/24 06:18