📱Next.jsでページ共通の処理をする(useEffectを使う例)2021/01/25に公開2021/01/277件Next.jsReacttechDiscussionShuhei Matsuoka2021/01/26に更新1. アプリのマウント時にログインユーザーの情報を取得して、グローバルステートにセット の次のコードについて質問させてください! function MyApp({ Component, pageProps, router }: AppProps) { // ↓ グローバルステートにユーザー情報をセットするためのもの const setCurrentUser = useSetRecoilState(currentUserState); useEffect(() => { (async function () { try { const { currentUser } = await fetchCurrentUser(); // サーバーへのリクエスト(未ログインの場合は401等を返すものとする) // ログインユーザーの情報が取得できたのでグローバルステートにセット setCurrentUser(currentUser); } catch { // 未ログイン(未ログイン時のリダイレクト処理などをここに書いても良いかも) setCurrentUser(null); } })(); },[]) return <Component {...pageProps} /> } 自分はいまNext.jsとRecoilを勉強中なんですが、間違っていたらすいません。 自分が理解している範囲では、Recoilを使うには次のようにRecoilRootで囲う必要があり、 <RecoilRoot> <Component {...pageProps} /> </RecoilRoot> またuseSetRecoilStateを呼ぶことはRecoilRootで囲った子コンポーネントでしかできないと思うんですよ。 上記はどうやるんでしょうか? 自分の理解が間違っていたらぜひ教えてください。 よろしくお願いします! Zenn最高です! catnose2021/01/26<RecoilRoot>、入れ忘れてました! 修正しました。ご指摘ありがとうございました。 cotapon2021/01/27 またuseSetRecoilStateを呼ぶことはRecoilRootで囲った子コンポーネントでしかできないと思うんですよ 私もこれが気になりまして、 <RecoilRoot> がある _app.tsx で setCurrentUser すると、 Error: This component must be used inside a <RecoilRoot> component. というエラーが出るので、 上記のコードでは、 _app.tsx 内で stateを更新することはできない気がしますが、どうすればいいでしょうか?? catnose2021/01/27に更新あ、そういうことですね。失礼しました。 useEffect部分(useSetRecoilStateを行う部分)を別コンポーネントに切り出せばOKだと思います。上述のコードもその形に修正しました。 cotapon2021/01/27ありがとうございます!コードめちゃくちゃ参考になります! あ、書き忘れてましたが、Zenn最高です!! catnose2021/01/27ご指摘ありがとうございました! && ありがとうございます! 返信を追加Shuhei Matsuoka2021/01/30ご回答ありがとうございます!!!! 最高です!!!!! 返信を追加
Shuhei Matsuoka2021/01/26に更新1. アプリのマウント時にログインユーザーの情報を取得して、グローバルステートにセット の次のコードについて質問させてください! function MyApp({ Component, pageProps, router }: AppProps) { // ↓ グローバルステートにユーザー情報をセットするためのもの const setCurrentUser = useSetRecoilState(currentUserState); useEffect(() => { (async function () { try { const { currentUser } = await fetchCurrentUser(); // サーバーへのリクエスト(未ログインの場合は401等を返すものとする) // ログインユーザーの情報が取得できたのでグローバルステートにセット setCurrentUser(currentUser); } catch { // 未ログイン(未ログイン時のリダイレクト処理などをここに書いても良いかも) setCurrentUser(null); } })(); },[]) return <Component {...pageProps} /> } 自分はいまNext.jsとRecoilを勉強中なんですが、間違っていたらすいません。 自分が理解している範囲では、Recoilを使うには次のようにRecoilRootで囲う必要があり、 <RecoilRoot> <Component {...pageProps} /> </RecoilRoot> またuseSetRecoilStateを呼ぶことはRecoilRootで囲った子コンポーネントでしかできないと思うんですよ。 上記はどうやるんでしょうか? 自分の理解が間違っていたらぜひ教えてください。 よろしくお願いします! Zenn最高です! catnose2021/01/26<RecoilRoot>、入れ忘れてました! 修正しました。ご指摘ありがとうございました。 cotapon2021/01/27 またuseSetRecoilStateを呼ぶことはRecoilRootで囲った子コンポーネントでしかできないと思うんですよ 私もこれが気になりまして、 <RecoilRoot> がある _app.tsx で setCurrentUser すると、 Error: This component must be used inside a <RecoilRoot> component. というエラーが出るので、 上記のコードでは、 _app.tsx 内で stateを更新することはできない気がしますが、どうすればいいでしょうか?? catnose2021/01/27に更新あ、そういうことですね。失礼しました。 useEffect部分(useSetRecoilStateを行う部分)を別コンポーネントに切り出せばOKだと思います。上述のコードもその形に修正しました。 cotapon2021/01/27ありがとうございます!コードめちゃくちゃ参考になります! あ、書き忘れてましたが、Zenn最高です!! catnose2021/01/27ご指摘ありがとうございました! && ありがとうございます! 返信を追加
cotapon2021/01/27 またuseSetRecoilStateを呼ぶことはRecoilRootで囲った子コンポーネントでしかできないと思うんですよ 私もこれが気になりまして、 <RecoilRoot> がある _app.tsx で setCurrentUser すると、 Error: This component must be used inside a <RecoilRoot> component. というエラーが出るので、 上記のコードでは、 _app.tsx 内で stateを更新することはできない気がしますが、どうすればいいでしょうか??
catnose2021/01/27に更新あ、そういうことですね。失礼しました。 useEffect部分(useSetRecoilStateを行う部分)を別コンポーネントに切り出せばOKだと思います。上述のコードもその形に修正しました。
Discussion
1. アプリのマウント時にログインユーザーの情報を取得して、グローバルステートにセット の次のコードについて質問させてください!
自分はいまNext.jsとRecoilを勉強中なんですが、間違っていたらすいません。
自分が理解している範囲では、Recoilを使うには次のように
RecoilRootで囲う必要があり、また
useSetRecoilStateを呼ぶことはRecoilRootで囲った子コンポーネントでしかできないと思うんですよ。上記はどうやるんでしょうか?
自分の理解が間違っていたらぜひ教えてください。
よろしくお願いします!
Zenn最高です!
<RecoilRoot>、入れ忘れてました!修正しました。ご指摘ありがとうございました。
私もこれが気になりまして、
<RecoilRoot>がある_app.tsxでsetCurrentUserすると、Error: This component must be used inside a <RecoilRoot> component.というエラーが出るので、 上記のコードでは、
_app.tsx内で stateを更新することはできない気がしますが、どうすればいいでしょうか??あ、そういうことですね。失礼しました。
useEffect部分(useSetRecoilStateを行う部分)を別コンポーネントに切り出せばOKだと思います。上述のコードもその形に修正しました。ありがとうございます!コードめちゃくちゃ参考になります!
あ、書き忘れてましたが、Zenn最高です!!
ご指摘ありがとうございました! && ありがとうございます!
ご回答ありがとうございます!!!!
最高です!!!!!