最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Can I use UseState with Server-Side-Rendering? - Stack Overflow

programmeradmin2浏览0评论

Can you use useState (and other react hooks?) with Server Side Rendering? Every time I am trying to run the code below I get the error

TypeError: Cannot read property 'useState' of null.

However, when I ment out the getServerSideProps function at the very bottom I have no problem running the code as intended. So my questions is can useState be used with Server Side Rendering in Nextjs? If the answer is yes, then where am I going wrong in the code below?

 import React from "react";
    import { useRouter } from "next/router";
    import useSelectedGenreInfoExtractor from "../../hooks/useSelectedGenreInfoExtractor";
    import { useState } from "react";
    import { useEffect } from "react";
    import Navbar from "../../ponents/Navbar";
    import useFetchTrendingCatagory from "../../hooks/useFetchTrendingCatagory";
    import useFetchTopRatedCatagory from "../../hooks/useFetchTopRatedCatagory";
    import useFetchMovieGenreResults from "../../hooks/useFetchMovieGenreResults";
    import Moviegenreresults from "../../ponents/Moviegenreresults";
    
export default function genre(props) {
      const [myresultsfromhook, setMyresultsfromhook] = useState();
      const [myreturnedmovies, setMyreturnedmovies] = useState();
    
      const router = useRouter();
      const { genre } = router.query;
    
      if (genre == "Trending") {
        let mymovies = useFetchTrendingCatagory();
        console.log("This is a log of my props", props);
    
        return (
          <div>
            {/* <Navbar /> */}
            <div>{genre}</div>
            <Moviegenreresults movies={mymovies} />
          </div>
        );
      } else if (genre == "Top Rated") {
        let mymovies = useFetchTopRatedCatagory();
    
        return (
          <div>
            {/* <Navbar /> */}
            <div>{genre}</div>
            <Moviegenreresults movies={mymovies} />
          </div>
        );
      } else {
        let mymovies = useFetchMovieGenreResults(genre);
    
        return (
          <div>
            {/* <Navbar /> */}
            <div>{genre}</div>
            <Moviegenreresults movies={mymovies} />
          </div>
        );
      }
    }
    
    export async function getServerSideProps(context) {
      if (context.params.genre == "Trending") {
        let mymovies = useFetchTrendingCatagory();
        return {
          props: {
            results: mymovies.results,
          },
        };
      } else if (context.params.genr == "Top Rated") {
        let mymovies = useFetchTopRatedCatagory();
        return {
          props: {
            results: mymovies.results,
          },
        };
      } else {
        let mymovies = useFetchMovieGenreResults(genre);
        return {
          props: {
            results: mymovies.results,
          },
        };
      }
    }

Can you use useState (and other react hooks?) with Server Side Rendering? Every time I am trying to run the code below I get the error

TypeError: Cannot read property 'useState' of null.

However, when I ment out the getServerSideProps function at the very bottom I have no problem running the code as intended. So my questions is can useState be used with Server Side Rendering in Nextjs? If the answer is yes, then where am I going wrong in the code below?

 import React from "react";
    import { useRouter } from "next/router";
    import useSelectedGenreInfoExtractor from "../../hooks/useSelectedGenreInfoExtractor";
    import { useState } from "react";
    import { useEffect } from "react";
    import Navbar from "../../ponents/Navbar";
    import useFetchTrendingCatagory from "../../hooks/useFetchTrendingCatagory";
    import useFetchTopRatedCatagory from "../../hooks/useFetchTopRatedCatagory";
    import useFetchMovieGenreResults from "../../hooks/useFetchMovieGenreResults";
    import Moviegenreresults from "../../ponents/Moviegenreresults";
    
export default function genre(props) {
      const [myresultsfromhook, setMyresultsfromhook] = useState();
      const [myreturnedmovies, setMyreturnedmovies] = useState();
    
      const router = useRouter();
      const { genre } = router.query;
    
      if (genre == "Trending") {
        let mymovies = useFetchTrendingCatagory();
        console.log("This is a log of my props", props);
    
        return (
          <div>
            {/* <Navbar /> */}
            <div>{genre}</div>
            <Moviegenreresults movies={mymovies} />
          </div>
        );
      } else if (genre == "Top Rated") {
        let mymovies = useFetchTopRatedCatagory();
    
        return (
          <div>
            {/* <Navbar /> */}
            <div>{genre}</div>
            <Moviegenreresults movies={mymovies} />
          </div>
        );
      } else {
        let mymovies = useFetchMovieGenreResults(genre);
    
        return (
          <div>
            {/* <Navbar /> */}
            <div>{genre}</div>
            <Moviegenreresults movies={mymovies} />
          </div>
        );
      }
    }
    
    export async function getServerSideProps(context) {
      if (context.params.genre == "Trending") {
        let mymovies = useFetchTrendingCatagory();
        return {
          props: {
            results: mymovies.results,
          },
        };
      } else if (context.params.genr == "Top Rated") {
        let mymovies = useFetchTopRatedCatagory();
        return {
          props: {
            results: mymovies.results,
          },
        };
      } else {
        let mymovies = useFetchMovieGenreResults(genre);
        return {
          props: {
            results: mymovies.results,
          },
        };
      }
    }
Share Improve this question edited Aug 8, 2023 at 2:20 Heretic Monkey 12.1k7 gold badges61 silver badges131 bronze badges asked Aug 29, 2022 at 2:09 IwanttoknowIwanttoknow 811 gold badge1 silver badge2 bronze badges 1
  • 1 You can't use hooks in getServerSideProps. See stackoverflow./questions/64202834/…. – code Commented Aug 29, 2022 at 3:59
Add a ment  | 

4 Answers 4

Reset to default 3

useState should be inside the ponent, it is a React hook. serverside functions are independent of React ponents.

I think the issue is the name of the ponent should be with capital letter:

 // not genre
 export default function Genre(props)

I think fundamentally the problem is the way you are using getServerSideProps.

Even thought the answer is you can not use useState inside getServerSideProps because this function run in the server, it is important to understand what getServerSideProps does and when, I think you can find very clear explanation about that in next docs.

https://nextjs/docs/basic-features/data-fetching/get-server-side-props

Inside getServerSideProps use axios or the fetch api to get your data and pass it to the props.

I am not 100% sure but I thinnk inn your case you can also use Promise.all() to get the data from those three api calls.

https://developer.mozilla/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

Ran into similar issue, but the solution ended up different so posting it here in case someone benefits in future.

Basically, one of the causes for TypeError: Cannot read property 'useState' of null can be React loaded multiple times and because of that unable to track properly if the hook is within the ponent.

There is a lot more details here and here and the root cause could be very different but likely to do with how the code is bundled. In my specific case, I had a separate folder for SSR code and shared code, and both of these had separate react and react-dom installed in their package.json. Removing the react and react-dom from the SSR specific folder and just reusing the shared one fixed the issue

The problem with this code is that you're using React hooks (useFetchTrendingCatagory, useFetchTopRatedCatagory, useFetchMovieGenreResults) inside the getServerSideProps function, which is not allowed. React hooks can only be used within React functional ponents or custom hooks. You should refactor your code to fetch data synchronously inside getServerSideProps using regular JavaScript functions or by using a data fetching library like axios or fetch.

发布评论

评论列表(0)

  1. 暂无评论