#前提・実現したいこと
ReactでSPAを開発しています。
状態管理はRedux(redux toolkit)を使用しており、react-routerでroutingしています。
サーバーはCloud Firestoreを使用しています。
TwitterやInstagramなど、よくあるSNSと同じように、
投稿を一覧表示するページ(postsコンポーネント)で特定の投稿をクリックすると、当該投稿の詳細(postコンポーネント)へ遷移するような構成を実装しています。
https://hogehoge.app/posts -> https://hogehoge.app/posts/0001
一覧表示ページを経由する(postsコンポーネントをrenderする)ことなく、任意の投稿詳細URLへ直接アクセスしても当該投稿が適切に表示されるようにしたいです。
#発生している問題
現在は投稿の一覧をサーバーから取得する処理をpostsコンポーネントで行なっているため、
直接特定の投稿へアクセスするとState内に値が存在せず、適切に表示することができません。
typescript
1//投稿を一覧表示するpostsコンポーネント 2const Posts: React.FC = () => { 3 const dispatch = useDispatch(); 4 const posts = useSelector((state: RootState) => state.post.posts); 5 6 useEffect(() => { 7 dispatch(initPosts()); 8 }, []); 9// 以下、DOMを描画するJSXの処理 10 return ( 11 <>...</> 12 ) 13}
typescript
1//投稿の詳細を表示するpostコンポーネント 2const Post: React.FC<UnitProps> = props => { 3 const posts = useSelector((state: RootState) => state.post.posts); 4 5 const id: string = props.match.params.id; 6 const post: PostData | undefined = posts.find(p => p.id === id); 7 8 9 let postDetail = null; 10 if( typeof post === 'undefined') { 11 postDetail = (<p>Post with id {id} doesn't exist.</p>); 12 } else { 13 postDetail = .... //投稿詳細を表示するJSX 14 } 15 return ( 16 <>{postDetail}</> 17 );
上記のようなコードを書いているのですが、直接特定の投稿詳細URLにアクセスすると、当然postがundefinedになります。postsコンポーネント経由で遷移しても、再読み込みを行うとStateがリセットされ、同様の問題が発生します。
#試してみたこと
postコンポーネント内で、Stateから取得した投稿の配列(posts)がundefinedの場合はinitPostsをdispatchする、という処理を試してみましたが、下記のようなエラーが出たため、適切ではないと判断しました。
React Hook “useEffect” is called conditionally
現在は、postコンポーネント内での当該投稿の取得ロジックを変更し、下記のようなカスタムフックにすることを検討しています。
0. State内の投稿一覧(posts)を参照する
0. posts内に当該投稿があるかを探す
0. ない場合、サーバーから当該投稿のみを取得する
ただ、もっと効率的な実装方法やデファクトのやり方があるのではないかとも考えています。
素人質問で恐縮ですが、考え方や参考情報のキーワードなどでもご提示いただけますと幸いです。
よろしくお願いいたします。
#使用している環境
react-router@5.1.8
react-redux@7.1.9
reduxjs/toolkit@1.3.6
types/react@16.9.35
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/13 05:54
2020/07/13 07:33
2020/07/13 07:42
2020/07/15 00:18