šŸŽ Checkout my Learn React by Making a Game course and get 1 month Free on Skillshare!

NextJs 13 – using Server Components in Client Components

We cannot directly import a server component into a client component in NextJs 13.

// ā›”ļø this will not work !!!

'use client';

import ReadFromDataBaseComponent from './ReadFromDataBaseComponent';

export default function ClientComponent() {
  // do something with ReadFromDataBaseComponent
}

The reason why we cannot import directly a server component into a client component is that the server component can have code for things like reading/writing files or databases that are only accessible on the server side.

To be able to use a server component in a client one we first need to render the server component and include just the resulting HTML in the client component. For this we need to wrap the Server component as a child (or property) for the Client component:

// šŸ‘ this works

export default function ClientComponent({ children }) {
  // do ClientComponent logic stuff here

  return (<>
    // ...
    {children}
  </>)
}

And now we can write in a NextJs 13 page:

import ClientComponent from "./ClientComponent";
import ReadFromDataBaseComponent from "./ReadFromDataBaseComponent";
```jsx
export default function Page() {
  return (
    <ClientComponent>
        // we will not have any server-side code here
        <ReadFromDataBaseComponent />
    </ClientComponent>
  );
}

The official documentation link on this subject.

šŸ“– 50 Javascript, React and NextJs Projects

Learn by doing with this FREE ebook! Not sure what to build? Dive in with 50 projects with project briefs and wireframes! Choose from 8 project categories and get started right away.

šŸ“– 50 Javascript, React and NextJs Projects

Learn by doing with this FREE ebook! Not sure what to build? Dive in with 50 projects with project briefs and wireframes! Choose from 8 project categories and get started right away.


One Reply

Leave a Reply

Your email address will not be published. Required fields are marked *