uz
Feedback
ToCode

ToCode

Kanalga Telegramโ€™da oโ€˜tish

ื˜ื™ืคื™ื ืงืฆืจื™ื ืœืžืชื›ื ืชื™ื ืžืืช ื™ื ื•ืŸ ืคืจืง

Ko'proq ko'rsatish
1 420
Obunachilar
+124 soatlar
+17 kunlar
-430 kunlar
Postlar arxiv
ToCode
1 420
ื”ื•ืจื“ืชื™ ืืช ื”ื˜ืงืกื˜ ื”ืžืœื ื›ื™ ื”ื•ื ืœื ื ื›ื ืก ื˜ื•ื‘ ืœื˜ืœื’ืจื ืขื“ื™ืฃ ืœื”ื™ื›ื ืก ืœืœื™ื ืง ืœืงืจื•ื ืžื”ืืชืจ

ToCode
1 420
ืžื“ืจื™ืš next.js ื—ืœืง 8 - ื”ืขืœืื” ืœืฉืจืช ื ืกื™ื™ื ืืช ื”ืžื“ืจื™ืš ื‘ื—ื™ื‘ื•ืจ ืขื ื•ืจืกืœ ืœืฆื•ืจืš ื”ืขืœืืช ื”ืืชืจ ืฉื›ืชื‘ื ื• ืœืื™ื ื˜ืจื ื˜. ืชื™ืงื•ืŸ ืฉื’ื™ืื•ืช ื‘ื ื™ื” ืœืคื ื™ ืฉืืคืฉืจ ืœื”ืขืœื•ืช ืืช ื”ืงื•ื“ ืœืฉืจืช ืฆืจื™ืš ืœื•ื•ื“ื ืฉื”ื•ื ื ื‘ื ื” ื‘ืœื™ ืฉื’ื™ืื•ืช, ื•ืื ืขืงื‘ืชื ืื—ืจื™ ื”ืžื“ืจื™ืš ืขื“ ื›ืืŸ ืชืฆื˜ืขืจื• ืœืฉืžื•ืข ืฉื–ื” ืœื ื”ืžืงืจื”. ื‘ืžื”ืœืš ื”ืขื‘ื•ื“ื” ืขืฉื™ืชื™ ืžืกืคืจ ืงื™ืฆื•ืจื™ ื“ืจืš ืฉืื•ืžื ื ื”ื™ื• ืงืœื™ื ื™ื•ืชืจ ืœื›ืชื™ื‘ื” ื•ื”ืกื‘ืจ ืื‘ืœ ื”ืจื’ื™ื–ื• ืืช next. ืืœื” ื”ื‘ืขื™ื•ืช ื”ืžืจื›ื–ื™ื•ืช: 1. ื‘ื›ืœ ื”ืงื•ืžืคื•ื ื ื˜ื•ืช ื™ื™ืฆืืชื™ ืคื•ื ืงืฆื™ื” ืื ื•ื ื•ืžื™ืช. ื ืงืกื˜ ืื•ื”ื‘ ืฉื™ืฉ ืฉื ืœื›ืœ ืงื•ืžืคื•ื ื ื˜ื” ื•ืœื›ืŸ ืื ื™ ืžื—ืœื™ืฃ ื›ืœ ื™ืฆื™ืจืช ืงื•ืžืคื•ื ื ื˜ื” ืœืคื•ื ืงืฆื™ื” ืžืžืฉ ืขื ืฉื, ื›ืœื•ืžืจ ื‘ืžืงื•ื ืœื›ืชื•ื‘:
export default () => { ... }
ืื ื™ ื›ื•ืชื‘:
export default function AboutPage() { ... }
2. ื‘ืงื•ืžืคื•ื ื ื˜ืช ื”ืชืคืจื™ื˜ ื”ื™ื” ืœื™ ืžืขืจืš ืฉืœ ืคืจื™ื˜ื™ื ืฉื›ืœืœื• ื ืชื™ื‘ ืขืœ ื”ืฉืจืช. ื”ื”ื’ื“ืจื” ื”ืžืงื•ืจื™ืช ืฉืœ ื”ืžืขืจืš ื”ื™ืชื”:
items: Array<{href: string, text: string}>
ืื‘ืœ ื ืงืกื˜ ืจื•ืฆื” ืœืขืฉื•ืช ื‘ื“ื™ืงืช ื˜ื™ืคื•ืกื™ื ื’ื ืขืœ ื”ื ืชื™ื‘ื™ื ืฉืื ื™ ืžืขื‘ื™ืจ ืœืืœืžื ื˜ Link ื•ืœื›ืŸ ื” href ืœื ื™ื›ื•ืœ ืœื”ื™ื•ืช ื›ืœ string ืืœื ืฆืจื™ืš ืœื”ื™ื•ืช ืžื—ืจื•ื–ืช ืฉื”ื™ื ื’ื ื ืชื™ื‘ ืชืงื ื™ ืขืœ ื”ืฉืจืช. ื‘ืฉื‘ื™ืœ ืœืชืงืŸ ืืช ืฉื’ื™ืืช ื”ื‘ื ื™ื” ื”ื—ืœืคืชื™ ืืช ื”ื”ื’ื“ืจื” ืœ:
export default function Menu<T extends string>({ items }: {
  items: Array<{href: Route<T>, text: string}>
}) {
3. ื”ื•ืกืคืชื™ ืžืืคื™ื™ืŸ key ืœื›ืœ ืจืฉื™ืžื”. ื–ื• ืจืฉื™ืžืช ื”ืฉื’ื™ืื•ืช ื”ืžืœืื” ืฉืชื™ืงื ืชื™:
diff --git a/src/app/about/page.tsx b/src/app/about/page.tsx
index cf82120..f697b7c 100644
--- a/src/app/about/page.tsx
+++ b/src/app/about/page.tsx
@@ -1,8 +1,8 @@
-export default () => {
+export default function About() {
   return (
     <div>
       <h1>About Us</h1>
-      <p>This is an example lesson for using next.js router</p>
+      <p>This is an example lesson for using next.js</p>
     </div>
   )
 }
\ No newline at end of file
diff --git a/src/app/components/menu.tsx b/src/app/components/menu.tsx
index 936ca44..468dfcc 100644
--- a/src/app/components/menu.tsx
+++ b/src/app/components/menu.tsx
@@ -1,16 +1,17 @@
 "use client";
 import Link from 'next/link';
+import type { Route } from 'next'
 import { usePathname } from 'next/navigation'
 
 
-export default ({ items }: {
-  items: Array<{href: String, text: String}>
-}) => {
+export default function Menu<T extends string>({ items }: {
+  items: Array<{href: Route<T>, text: String}>
+}) {
   const pathname = usePathname()
   return (
     <nav className='flex my-4 border-4 border-indigo-200 border-l-indigo-500'>
       {items.map(item => (
-      <div className='flex-1 px-2'>
+      <div className='flex-1 px-2' key={item.href}>
       <Link href={item.href} >{item.text}</Link>
       {pathname == item.href &&
       <span className="ml-2 w-2 h-2 bg-blue-500 rounded-full inline-block"></span>
diff --git a/src/app/counter.tsx b/src/app/counter.tsx
index 50da28f..c4bb5a4 100644
--- a/src/app/counter.tsx
+++ b/src/app/counter.tsx
@@ -2,7 +2,7 @@
 import { useState } from 'react';
 import Header from './header';
 
-export default () => {
+export default function Counter() {
   const [count, setCount] = useState(0);
   console.log('counter');
   return (
diff --git a/src/app/header.tsx b/src/app/header.tsx
index 0ff3c50..a9e22f5 100644
--- a/src/app/header.tsx
+++ b/src/app/header.tsx
@@ -1,4 +1,4 @@
-export default () => {
+export default function Header() {
   console.log('header');
   return <h1>Counter Header</h1>
 }
\ No newline at end of file
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index 5cd02da..b27557b 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -2,7 +2,7 @@ import type { Metadata } from 'next'
 import { UserProvider } from '@auth0/nextjs-auth0/client';
 
 import { Inter } from 'next/font/google'
-import TopMenu from './servermenu';
+import TopMenu from './menu';
 import './globals.css'
 
 const inter = Inter({ subsets: ['latin'] })
diff --git a/src/app/menu.tsx b/src/app/menu.tsx
index 1e40b9c..2043559 100644
--- a/src/app/menu.tsx
+++ b/src/app/menu.tsx
@@ -2,7 +2,7 @@ import Menu from './components/menu';
 import { readdir } from 'node:fs/promises';
 import { existsSync } from 'node:fs';
 
-export default async () => {

ToCode
1 420
<span className="ml-2 w-2 h-2 bg-blue-500 rounded-full inline-block"></span>
      }
    </div>
      ))}
    </nav>
  )
}
ืขื›ืฉื™ื• ืงื•ืžืคื•ื ื ื˜ืช ืฆื“ ื”ืœืงื•ื— ืขื•ืฉื” ืฉื ื™ ื“ื‘ืจื™ื: ื”ื™ื ื’ื ืžืงื‘ืœืช ื‘ืฆื•ืจื” ื“ื™ื ืžื™ืช ืืช ืจืฉื™ืžืช ื”ื“ืคื™ื ืžื”ืฉืจืช, ื•ื’ื ืžืฉืชืžืฉืช ื‘ usePathname ื›ื“ื™ ืœื”ืฆื™ื’ ืืช ื”ืขื™ื’ื•ืœ ืœื™ื“ ื”ืคืจื™ื˜ ื”ืคืขื™ืœ ื‘ืชืคืจื™ื˜. ื•ื‘ืื•ืคืŸ ื›ืœืœื™ ื ืจืฆื” ืœื‘ื ื•ืช ื™ื™ืฉื•ืžื™ Next.js ื‘ืžื‘ื ื” ืฉืœ ืฉื™ืชื•ืฃ ืคืขื•ืœื” ื‘ื™ืŸ ืงื•ืžืคื•ื ื ื˜ื•ืช ืฆื“ ืฉืจืช ืœืงื•ืžืคื•ื ื ื˜ื•ืช ืฆื“ ืœืงื•ื—. ืงื•ืžืคื•ื ื ื˜ืช ืฆื“ ืฉืจืช ืชืžืฉื•ืš ืืช ื”ืžื™ื“ืข, ืœืžืฉืœ ื“ืจืš ืคื ื™ื™ื” ืœื‘ืกื™ืก ื ืชื•ื ื™ื, ืœ API ืžืจื•ื—ืง ืื• ืœืžืขืจื›ืช ืงื‘ืฆื™ื, ืชืขื‘ื™ืจ ืืช ื”ืžื™ื“ืข ืœืงื•ืžืคื•ื ื ื˜ืช ืฆื“ ืœืงื•ื— ื“ืจืš props ื•ืงื•ืžืคื•ื ื ื˜ืช ืฆื“ ืœืงื•ื— ืชื•ื›ืœ ืœื”ืฆื™ื’ ืืช ื”ืžื™ื“ืข ื‘ืฆื•ืจื” ืื™ื ื˜ืจืงื˜ื™ื‘ื™ืช ืชื•ืš ืฉื™ืžื•ืฉ ื‘ืกื˜ื™ื™ื˜. ื›ืฉืื•ืชื” ืงื•ืžืคื•ื ื ื˜ืช ืฆื“ ืœืงื•ื— ืชืฆื˜ืจืš ืœืขื“ื›ืŸ ื—ื–ืจื” ืืช ื”ืฉืจืช ื ืฉืชืžืฉ ื‘ืžื ื’ื ื•ืŸ ืฉืจืื™ื ื• ื‘ืคืจืง ื”ืงื•ื“ื ืฉืœ ื”ืžื“ืจื™ืš ื•ื›ืš ื”ืขื“ื›ื•ืŸ ื™ื’ืจื•ื ืœืจื™ืขื ื•ืŸ ืฉืœ ืงื•ืžืคื•ื ื ื˜ื•ืช ืฆื“ ื”ืฉืจืช ืฉื‘ืขืžื•ื“ ื•ื‘ืžื™ื“ื” ื•ื”ืžื™ื“ืข ื™ืฉืชื ื” ื’ื ืงื•ืžืคื•ื ื ื˜ื•ืช ืฆื“ ื”ืœืงื•ื— ื™ืงื‘ืœื• ืคืจื•ืคืก ื—ื“ืฉื™ื ื•ื™ืฆื™ื’ื• ืืช ื”ืชื•ื›ืŸ ื”ืžืขื•ื“ื›ืŸ ืขืœ ื”ืžืกืš.

ToCode
1 420
ืžื“ืจื™ืš Next.JS ื—ืœืง 6 - ืฉื™ืœื•ื‘ ืงื•ืžืคื•ื ื ื˜ื•ืช ืฆื“-ืœืงื•ื— ื•ืฆื“-ืฉืจืช ื‘ื•ืื• ื ื—ื–ื•ืจ ืœืชืคืจื™ื˜ ื”ืขืœื™ื•ืŸ ืฉื›ืชื‘ื ื• ื‘ืืคืœื™ืงืฆื™ื”. ืื ืขืงื‘ืชื ืื—ืจื™ ื”ืžื“ืจื™ืš ื•ื”ืชืจื’ื™ืœื™ื ืฆืจื™ื›ื•ืช ืœื”ื™ื•ืช ืœื›ื ืฉืชื™ ื’ื™ืจืกืื•ืช ืœืงื•ืžืคื•ื ื ื˜ื” ื–ื• - ื’ื™ืจืกืช ืงื•ืžืคื•ื ื ื˜ืช ืฆื“-ืฉืจืช ืฉืœ ื”ืชืคืจื™ื˜ ื”ืขืœื™ื•ืŸ, ืฉืžื—ืคืฉืช ื‘ืฆื•ืจื” ื“ื™ื ืžื™ืช ืืช ื›ืœ ื”ืชื™ืงื™ื•ืช ืฉืžื™ื™ืฆื’ื•ืช "ื“ืคื™ื" ื•ืžืฆื™ื’ื” ืชืคืจื™ื˜ ืฉืžื™ื•ืฆืจ ืื•ื˜ื•ืžื˜ื™ืช ืžื”ื“ืคื™ื ื”ืงื™ื™ืžื™ื, ื•ื’ื™ืจืกืช ืงื•ืžืคื•ื ื ื˜ืช ืฆื“-ืœืงื•ื— ืฉืžืฉืชืžืฉืช ื‘ืจืฉื™ืžื” ืงื‘ื•ืขื” ืฉืœ ื“ืคื™ื ืื‘ืœ ื›ื•ืœืœืช ืขื™ื’ื•ืœ ืงื˜ืŸ ืœื™ื“ ื”ื“ืฃ ื”ืคืขื™ืœ. ื‘ื—ืœืง ื–ื” ื ืจืื” ืื™ืš ืœืฉืœื‘ ืืช ืฉืชื™ ื”ืงื•ืžืคื•ื ื ื˜ื•ืช ื›ื“ื™ ืœื™ื”ื ื•ืช ืžื”ื˜ื•ื‘ ืžืฉื ื™ ื”ืขื•ืœืžื•ืช - ื’ื ืœืงื‘ืœ ืชืคืจื™ื˜ ืฉื ื•ืฆืจ ื“ื™ื ืžื™ืช ืžืชื•ืš ื”ืชื™ืงื™ื•ืช ื‘ืฉืจืช, ื•ื’ื ืœืงื‘ืœ ืกื™ืžื•ืŸ ืœื ืชื™ื‘ ื”ืคืขื™ืœ ื‘ืขื–ืจืช JavaScript ื‘ืฆื“ ืœืงื•ื—. ืžื” ื‘ืขืฆื ื”ื‘ืขื™ื” ื‘ื•ืื• ื ื™ื–ื›ืจ ื‘ืฉืชื™ ืงื•ืžืคื•ื ื ื˜ื•ืช ื”ืชืคืจื™ื˜ ื•ื‘ื‘ืขื™ื•ืช ืฉืœ ื›ืœ ืื—ืช ืžื”ืŸ. ื”ืชืคืจื™ื˜ ื‘ืงื•ืžืคื•ื ื ื˜ืช ืฆื“ ืœืงื•ื— ื ืจืื” ื›ืš:
"use client";
import Link from 'next/link';
import { usePathname } from 'next/navigation'

export default () => {
  const pathname = usePathname()
  return (
    <nav className='flex my-4 border-4 border-indigo-200 border-l-indigo-500'>
      <div className='flex-1 px-2'>
        <Link href="/" >Home</Link>
        {pathname == "/" &&
        <span className="ml-2 w-2 h-2 bg-blue-500 rounded-full inline-block"></span>
        }

      </div>
      <div className='flex-1 px-2'>
        <Link href="/about" >About</Link>
        {pathname == "/about" &&
        <span className="ml-2 w-2 h-2 bg-blue-500 rounded-full inline-block"></span>
        }
      </div>
    </nav>
  )
}
ื‘ื’ืœืœ ืฉื–ื• ืงื•ืžืคื•ื ื ื˜ืช ืฆื“ ืœืงื•ื— ืื ื™ ืœื ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื‘ืคื•ื ืงืฆื™ื•ืช ืฉืœ ืžืขืจื›ืช ื”ืงื‘ืฆื™ื ืฉืœ ื”ืฉืจืช ื›ืžื• readdir ื›ื“ื™ ืœืงื‘ืœ ืืช ืจืฉื™ืžืช ื›ืœ ื”ืชื™ืงื™ื•ืช ืขืœ ื”ืฉืจืช, ื•ืœื›ืŸ ืื ื™ ืžืฉืชืžืฉ ื‘ืจืฉื™ืžื” ืงื‘ื•ืขื”. ื‘ืฆื“ ื”ืฉืจืช ืฉืœื—ืชื™ ืืชื›ื ื‘ืื—ื“ ื”ืชืจื’ื™ืœื™ื ืœื›ืชื•ื‘ ืงื•ืžืคื•ื ื ื˜ืช ืฆื“-ืฉืจืช ืฉืžื•ืฆืืช ืืช ื›ืœ ื”ื“ืคื™ื ืฉืฆื•ืจื” ื“ื™ื ืžื™ืช ื•ื™ื•ืฆืจืช ืžื”ื ืชืคืจื™ื˜, ื•ืื•ืœื™ ื›ืชื‘ืชื ืงื•ืžืคื•ื ื ื˜ื” ืฉื ืจืื™ืช ื›ืš:
import { readdir } from 'node:fs/promises';
import Link from 'next/link';
import { existsSync } from 'node:fs';

export default async () => {  
  const pages = [
    {href: '/', text: 'home'},
    ...(await readdir('./src/app', { withFileTypes: true }))
    .filter(f => f.isDirectory)
    .filter(f => existsSync(\${f.path}/${f.name}/page.tsx\))
    .map(f => (
      {href: '/' + f.name, text: f.name}
    ))
  ]
    
  return (
    <nav className='flex my-4 border-4 border-indigo-200 border-l-indigo-500'>
      {pages.map(page => (
        <div className='flex-1 px-2'>
          <Link href={page.href} >{page.text}</Link>
        </div>))}
    </nav>
  )
}
ื‘ืงื•ืžืคื•ื ื ื˜ื” ื–ื• ืื ื™ ืœื ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื‘ usePathname() ืžืื—ืจ ื•ื”ื’ื™ืฉื” ืœ pathName ืžื•ื’ื‘ืœืช ืœืงื•ืžืคื•ื ื ื˜ื•ืช ืฆื“-ืœืงื•ื— ื‘ืœื‘ื“. ื”ืคื™ืชืจื•ืŸ - ืฉื™ืœื•ื‘ ื›ื•ื—ื•ืช ื”ืžื‘ื ื” ืฉืœ ืงื•ืžืคื•ื ื ื˜ืช ืฆื“ ืฉืจืช ืฉื™ื•ื“ืขืช ืœื’ืฉืช ืœืžื™ื“ืข ื•ืงื•ืžืคื•ื ื ื˜ืช ืฆื“ ืœืงื•ื— ืฉื™ื•ื“ืขืช ืœื”ืฆื™ื’ ืืช ื”ืžื™ื“ืข ื‘ืฆื•ืจื” ืื™ื ื˜ืจืงื˜ื™ื‘ื™ืช ื”ื•ื ื‘ืขืฆื ืชื‘ื ื™ืช ื“ื™ ื ืคื•ืฆื” ื‘ืืคืœื™ืงืฆื™ื•ืช ื•ื•ื‘ ื•ื‘ืืคืœื™ืงืฆื™ื•ืช next.js ื‘ืžื™ื•ื—ื“. ื”ืคื™ืชืจื•ืŸ ืœืืชื’ืจ ื”ื–ื” ื”ื•ื ืคืฉื•ื˜ ืœื—ืœืง ืืช ื”ืขื‘ื•ื“ื” ืœืฉืชื™ ืงื•ืžืคื•ื ื ื˜ื•ืช, ื›ืš ืฉืงื•ืžืคื•ื ื ื˜ืช ืฆื“ ืฉืจืช ืžืจื ื“ืจืช ืงื•ืžืคื•ื ื ื˜ืช ืฆื“ ืœืงื•ื— ื•ืžืขื‘ื™ืจื” ืœื” ืืช ื”ืžื™ื“ืข ืฉื”ื™ื ืฆืจื™ื›ื” ื‘ืชื•ืจ props. ื‘ืงื•ื‘ืฅ ืื—ื“ ื‘ืฉื menu.tsx ืื ื™ ื›ื•ืชื‘ ืืช ื”ืชื•ื›ืŸ ื”ื‘ื ืœืงื•ืžืคื•ื ื ื˜ืช ืฆื“ ื”ืฉืจืช:
import Menu from './components/menu';
import { readdir } from 'node:fs/promises';
import { existsSync } from 'node:fs';

export default async () => {  
  const pages = (await readdir('./src/app', { withFileTypes: true }))
  .filter(f => f.isDirectory)
  .filter(f => existsSync(\${f.path}/${f.name}/page.tsx\))
  .map(f => (
    {href: '/' + f.name, text: f.name}
  ))

  return <Menu items={[
    {href: "/", text: "home"},
    ...pages
  ]} />
}
ื•ื‘ืงื•ื‘ืฅ ืื—ืจ ื‘ืฉื components/menu.tsx ืื ื™ ื›ื•ืชื‘ ืืช ื”ืชื•ื›ืŸ ื”ื‘ื:
"use client";
import Link from 'next/link';
import { usePathname } from 'next/navigation'


export default ({ items }: {
  items: Array<{href: String, text: String}>
}) => {
  const pathname = usePathname()
  return (
    <nav className='flex my-4 border-4 border-indigo-200 border-l-indigo-500'>
      {items.map(item => (
      <div className='flex-1 px-2'>
      <Link href={item.href} >{item.text}</Link>
      {pathname == item.href &&

ToCode
1 420
ืžืฉื—ืง ื˜ื•ื‘ ืขื ื”ืงื•ื“ ื‘ื ืงื•ื“ื” ื”ื–ืืช ื™ื”ื™ื” ืœื”ื•ืกื™ืฃ ืขื•ื“ ืคืขื•ืœื•ืช ืขืœ ื”ืคื•ืกื˜ื™ื - ื ืกื• ืœื”ื•ืกื™ืฃ ืืคืฉืจื•ื™ื•ืช ืœืขืจื™ื›ื” ื•ืžื—ื™ืงื” ืฉืœ ืคื•ืกื˜ื™ื. ืื—ืจื™ ืฉื–ื” ืขื•ื‘ื“ ื”ื•ืกื™ืคื• ืงื•ืžืคื•ื ื ื˜ื” ื—ื“ืฉื” ืฉืžืฆื™ื’ื” ืืช ืžืกืคืจ ื”ืคื•ืกื˜ื™ื ื‘ืขืžื•ื“ ื•ืฉื™ืžื• ืœื‘ ืฉื”ืžื™ื“ืข ืฉื‘ื” ืžืชืจืขื ืŸ ื›ืœ ืคืขื ืฉืืชื ืžื•ืกื™ืคื™ื ืื• ืžื•ื—ืงื™ื ืคื•ืกื˜.

ToCode
1 420
ืžื“ืจื™ืš Next.JS ื—ืœืง 5 - ืขื“ื›ื•ืŸ ื‘ืกื™ืก ื”ื ืชื•ื ื™ื ืžื˜ื•ืคืก ื‘ื“ืคื“ืคืŸ ื‘ื—ืœืง ื”ืงื•ื“ื ืฉืœ ื”ืžื“ืจื™ืš ื‘ื ื™ื ื• ืจืฉื™ืžืช ืคื•ืกื˜ื™ื ืฉื ื•ืฆืจื” ื‘ืฆื•ืจื” ืกื˜ื˜ื™ืช ืขืœ ื”ืฉืจืช ื‘ืขื–ืจืช ืกืงืจื™ืคื˜ seed.ts. ื”ื›ื— ื”ืืžื™ืชื™ ืฉืœ next.js ื”ื•ื ื”ืื™ื ื˜ื’ืจืฆื™ื” ื‘ื™ืŸ ืงื•ื“ ืฆื“ ืฉืจืช ืœืงื•ื“ ืฆื“ ืœืงื•ื—, ืฉืขื•ื‘ื“ืช ื›ืžืขื˜ ื‘ืœื™ ืฉื ืฉื™ื ืœื‘ ืฉื™ืฉ ืคื” ืจื›ื™ื‘ื™ ืชื•ื›ื ื” ืฉืจืฆื™ื ืขืœ ืžื›ื•ื ื•ืช ืฉื•ื ื•ืช. ื‘ื•ืื• ื ืจืื” ืื™ืš ื–ื” ืขื•ื‘ื“ ื“ืจืš ื”ื•ืกืคืช ื˜ื•ืคืก ืœื™ื™ืฉื•ื ืฉื™ื•ืกื™ืฃ ืคื•ืกื˜ ื—ื“ืฉ ืœืขืžื•ื“ ื”ืคื•ืกื˜ื™ื. ืคื•ื ืงืฆื™ื” ืœื™ืฆื™ืจืช ืคื•ืกื˜ ื—ื“ืฉ ื ื™ืฆื•ืจ ืชื™ืงื™ื™ื” ื‘ืฉื db ื•ื‘ืชื•ื›ื” ืงื•ื‘ืฅ ื‘ืฉื posts.ts ืขื ื”ืชื•ื›ืŸ ื”ื‘ื:
"use server"

import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()

export async function createPost(author: string, text: string) {
  const res = await prisma.post.create({
    data: {
      author,
      text,
    }
  })
  
  return res;
}
ื”ืงื•ื“ ื“ื•ืžื” ืžืื•ื“ ืœืžื” ืฉื›ืชื‘ื ื• ื‘ืงื•ื‘ืฅ ื” seed.ts, ืจืง ืฉื”ืคืขื ื ืžืฆื ื‘ืชื•ืš ืคื•ื ืงืฆื™ื” ืฉืืคืฉืจ ืœื”ืฉืชืžืฉ ื‘ื” ื’ื ืžืงื‘ืฆื™ื ืื—ืจื™ื. ื”ืคืชื™ื— use server ืœืงื•ื‘ืฅ ื’ื•ืจื ืœ next.js ืœื ืœื”ื›ื ื™ืก ืืช ื”ืงื•ื“ ื”ื–ื” ืœ JavaScript ืฉื™ืจื•ืฅ ื‘ืฆื“ ื”ืœืงื•ื—. ืงื•ืžืคื•ื ื ื˜ืช ืฆื“ ืœืงื•ื— ืขื‘ื•ืจ ื”ื˜ื•ืคืก ื‘ืคืจื™ื™ืžื•ื•ืจืงื™ื "ืจื’ื™ืœื™ื" ืœื›ืชื™ื‘ืช ืงื•ื“ ืฆื“ ืฉืจืช ื”ื™ื™ื ื• ืฆืจื™ื›ื™ื ืขื›ืฉื™ื• ืœื›ืชื•ื‘ ื ืชื™ื‘ ื‘ API ืฉื™ืงืจื ืœืคื•ื ืงืฆื™ื”, ื•ืื– ืœื›ืชื•ื‘ ืงื•ื“ ื‘ืฆื“ ืฉืœ ืจื™ืืงื˜ ืฉื™ืคื ื” ืœื ืชื™ื‘ ื”ื–ื” ื›ืฉืœื•ื—ืฆื™ื ืขืœ ืื™ื–ืฉื”ื• ื›ืคืชื•ืจ ื‘ืืคืœื™ืงืฆื™ื”. ื‘ next.js ื—ืกื›ื• ืœื ื• ืืช ื›ืœ ื”ืขื‘ื•ื“ื” ื•ืื ื—ื ื• ื™ื›ื•ืœื™ื ืคืฉื•ื˜ "ืœืงืจื•ื" ืœืคื•ื ืงืฆื™ื” createPost ื™ืฉื™ืจื•ืช ืžืงื•ืžืคื•ื ื ื˜ืช ืจื™ืืงื˜. ืื ื™ ื™ื•ืฆืจ ืงื•ื‘ืฅ ื—ื“ืฉ ื‘ืชื™ืงื™ื™ืช posts ื‘ืฉื newpost.tsx ื•ื”ืงื•ื“ ืฉืœื• ื ืจืื” ื›ื›ื”:
"use client";
import { useRef } from 'react';
import { useRouter } from 'next/navigation';
import { createPost
 } from "../db/posts"

export default () => {
  const router = useRouter();
  const textFieldRef = useRef<HTMLInputElement>(null);

  async function handleCreate(formData: FormData) {
    const author = formData.get('author') as string;
    const text = formData.get('text') as string;
    const newPost = await createPost(author, text);
    console.log(newPost);
    if (textFieldRef.current) {
      textFieldRef.current.value = '';
    }
    router.refresh();
  }

  return (
    <form action={handleCreate}>
      <label>
        Author: 
        <input type="text" name="author" className="text-black"/>
      </label>
      
      <label>
        Text: 
        <input type="text" name="text" className="text-black" ref={textFieldRef} />
      </label>
      <input type="submit" value="Create" />
    </form>
  )
}
ื”ื‘ืœื•ืง ื”ืจืืฉื•ืŸ ืœืงืจื•ื ื›ืืŸ ื”ื•ื ื”ื’ื“ืจืช ื”ืคื•ื ืงืฆื™ื” handleCreate. ื‘ื•ืื• ื ืกืชื›ืœ ืขืœื™ื”:
async function handleCreate(formData: FormData) {
  const author = formData.get('author') as string;
  const text = formData.get('text') as string;
  const newPost = await createPost(author, text);
  console.log(newPost);
  if (textFieldRef.current) {
    textFieldRef.current.value = '';
  }
  router.refresh();
}
ื”ืคื•ื ืงืฆื™ื” ืžืงื‘ืœืช ืื•ื‘ื™ืงื˜ ืžืกื•ื’ FormData, ืžื•ืฉื›ืช ืžืžื ื• ืฉื ื™ ืฉื“ื•ืช ืขื‘ื•ืจ ื›ื•ืชื‘ ื”ืคื•ืกื˜ ื•ื”ื˜ืงืกื˜ ืฉืœ ื”ืคื•ืกื˜ ื•ืื– ืžื’ื™ืขื” ืœืฉื•ืจืช ื”ืžื—ืฅ ืฉื–ื• ื”ืงืจื™ืื” ืœ createPost. ื–ื• ื‘ืขืฆื ื”ืงืจื™ืื” ื“ืจืš API ืœืคื•ื ืงืฆื™ื” ืฉื ืžืฆืืช ื‘ืฆื“ ื”ืฉืจืช. ื”ื—ืœืง ื”ืฉื ื™ ืฉืœ ื”ืคื•ื ืงืฆื™ื”, ื–ื” ืฉืžื•ืคื™ืข ืื—ืจื™ ื” await ืœ createPost ื™ื™ืงืจื ืื—ืจื™ ืฉื”ืฉืจืช ื™ืกื™ื™ื ืœื™ืฆื•ืจ ืืช ื”ืคื•ืกื˜ ื”ื—ื“ืฉ. ื‘ืฉืœื‘ ื”ื–ื” ื™ืฉ ืœื ื• ืฉืชื™ ืžืฉื™ืžื•ืช: ืื ื—ื ื• ืฆืจื™ื›ื™ื ืœื ืงื•ืช ื—ืœืง ืžื”ืฉื“ื•ืช ื‘ื˜ื•ืคืก (ืื ื™ ืจืฆื™ืชื™ ืœื ืงื•ืช ืืช ืฉื“ื” ื” text ื›ื“ื™ ืฉื™ื”ื™ื” ืงืœ ืœื”ืžืฉื™ืš ืœื›ืชื•ื‘ ืคื•ืกื˜ื™ื), ื•ืœืจืขื ืŸ ืืช ืจืฉื™ืžืช ื”ืคื•ืกื˜ื™ื ื›ื“ื™ ืœืจืื•ืช ืืช ื”ืคื•ืกื˜ ื”ื—ื“ืฉ. ื”ืคื•ื ืงืฆื™ื” router.refresh ืฉืžื’ื™ืขื” ืžืชื•ืš ื” router ืฉืœ next ื”ื™ื ืฉืื—ืจืื™ืช ืœืงืกื ื”ืฉื ื™. ื”ืคื•ื ืงืฆื™ื” ืžืจืขื ื ืช ืืช ืงื•ืžืคื•ื ื˜ื˜ื•ืช ืฆื“ ื”ืฉืจืช ืฉื ืžืฆืื•ืช ืขืœ ื”ื“ืฃ ื”ื ื•ื›ื—ื™, ื‘ืœื™ ืœืžื—ื•ืง ืืช ื”ืกื˜ื™ื™ื˜ ืฉืœ ืงื•ืžืคื•ื ื ื˜ื•ืช ืฆื“ ื”ืœืงื•ื—. ื›ืš ืจืฉื™ืžืช ื”ืคื•ืกื˜ื™ื ืžืชืขื“ื›ื ืช ืื‘ืœ ืฉืืจ ื”ืขืžื•ื“ ืœื ืžื•ืฉืคืข. ื›ืœ ืžื” ืฉืฆืจื™ืš ื‘ืฉื‘ื™ืœ ืœืกื™ื™ื ืืช ื”ื“ื•ื’ืžื” ื”ื•ื ืœื”ื•ืกื™ืฃ ืœืงื•ื‘ืฅ posts/page.tsx ืืช ืงื•ืžืคื•ื ื ื˜ืช ื”ื˜ื•ืคืก ื”ื—ื“ืฉ ืฉื‘ื ื™ื ื• ื•ื ื•ื›ืœ ืœื”ื™ื›ื ืก ืœืขืžื•ื“ ื•ืœื”ื•ืกื™ืฃ ืคื•ืกื˜ื™ื:
import { PrismaClient } from '@prisma/client'
import NewPost from './newpost';
const prisma = new PrismaClient()

export default async () => {
  const posts = await prisma.post.findMany();

  return (
    <main className='p-2'>
      <NewPost />
      <ul>
        {posts.map(post => (
          <li><b>{post.author}</b> {post.text}</li>
        ))}
      </ul>
    </main>
  )
}
ืขื›ืฉื™ื• ืืชื

ToCode
1 420
2. ื‘ื•ืื• ื ืฉื—ืง ืขื ืžื ื’ื ื•ืŸ ื” Cache ืฉืœ ื ืงืกื˜ - ื”ื•ืกื™ืคื• ืขืžื•ื“ ื ื•ืกืฃ ืฉืžืฆื™ื’ ืืช ื”ืชืืจื™ืš ื•ืฉืขื” ื”ื ื•ื›ื—ื™ื™ื ืขื new Date. ื ืกื• ืœื ื•ื•ื˜ ืืœื™ื• ื“ืจืš ื”ืชืคืจื™ื˜ ื•ืฉื™ืžื• ืœื‘ ืžืชื™ ื”ืขืจืš ื™ืฉืชื ื”. ื ืกื• ื’ื ืœืจืขื ืŸ ืืช ื”ืขืžื•ื“ ืขื F5 ื•ืฉื™ืžื• ืœื‘ ืœืฉื™ื ื•ื™ื™ื. 3. ื”ื•ืฆื™ืื• ืืช ื” Link ื™ื—ื“ ืขื ื”ืขื™ื’ื•ืœ ืฉืœื• ืœืงื•ืžืคื•ื ื ื˜ื” ื ืคืจื“ืช ื›ื“ื™ ืฉืชื•ื›ืœื• ืœื”ืคื•ืš ืืช ืงื•ืžืคื•ื ื ื˜ืช ื”ืชืคืจื™ื˜ ื—ื–ืจื” ืœืงื•ืžืคื•ื ื ื˜ืช ืฆื“-ืฉืจืช.

ToCode
1 420
ืžื“ืจื™ืš Next.JS ื—ืœืง 3 - ื ื™ื•ื•ื˜ ื‘ื™ืŸ ื“ืคื™ื ืื—ื“ ื”ืืชื’ืจื™ื ื”ืžืฉืžืขื•ืชื™ื™ื ื‘ืคื™ืชื•ื— Single Page Application ื•ืฉื™ืžื•ืฉ ื‘ JavaScript Frameworks ื”ื™ื” ืชืžื™ื“ ื”ื ื™ื•ื•ื˜ ื‘ื™ืŸ ื“ืคื™ื. ื‘ืคืขื•ืœื” ื”ืจื’ื™ืœื” ืฉืœื• ื‘ื“ืคื“ืคืŸ ื›ืœ ืคืขื ืฉืขื•ื‘ืจื™ื ืœื“ืฃ ื—ื“ืฉ ื‘ืืชืจ ื”ื“ืคื“ืคืŸ ื˜ื•ืขืŸ ืงื•ื‘ืฅ HTML ื—ื“ืฉ ื•ืืช ื›ืœ ื”ื ื›ืกื™ื ืฉืœื• ื•ืžืฆื™ื’ ืืช ื”ืชื•ื›ืŸ ื”ื—ื“ืฉ, ื•ื›ืžื•ื‘ืŸ ืžื ืงื” ืืช ื›ืœ ื”ื–ื™ื›ืจื•ืŸ ืฉืœ ื” JavaScript. ื”ื‘ืขื™ื” ื‘ื™ื™ืฉื•ืžื™ Single Page Applications, ืื• ืื•ืœื™ ื™ื•ืชืจ ื ื›ื•ืŸ ืœื”ื’ื™ื“ ื”ื™ืชืจื•ืŸ ื‘ื™ื™ืฉื•ืžื™ื ื›ืืœื”, ื”ื•ื ืฉืขื›ืฉื™ื• ืื™ืŸ ืฆื•ืจืš ืœื˜ืขื•ืŸ ืืช ื›ืœ ื”ื“ืฃ ืžื—ื“ืฉ ื‘ืžืขื‘ืจ ื‘ื™ืŸ ื“ืคื™ื, ื•ืฉื‘ืขื–ืจืช JavaScript ืืคืฉืจ ืœืชืช ืœืžืฉืชืžืฉ ื”ืจื’ืฉื” ืฉืœ ืžืขื‘ืจ ื‘ื™ืŸ ื“ืคื™ื ื‘ืœื™ ืœืขื‘ื•ืจ ื“ืจืš ืžื ื’ื ื•ืŸ ื–ื” ื‘ื“ืคื“ืคืŸ, ื•ื›ืš ืœืงื‘ืœ ื‘ื™ืฆื•ืขื™ื ื”ืจื‘ื” ื™ื•ืชืจ ื˜ื•ื‘ื™ื. ืื™ืš ื–ื” ืขื•ื‘ื“ ื‘ Next.JS ืžื ื’ื ื•ืŸ ื”ืžืขื‘ืจ ื‘ื™ืŸ ื“ืคื™ื ืžื•ื‘ื ื” ื‘ืชื•ืš ื”ืคืจื™ื™ืžื•ื•ืจืง. ืœ next ื™ืฉ ืงื•ืžืคื•ื ื ื˜ื” ืžื™ื•ื—ื“ืช ื‘ืฉื Link ืฉืœื—ื™ืฆื” ืขืœื™ื” ื’ื•ืจืžืช ืœ JavaScript ืœื˜ืขื•ืŸ ืืช ื”ืงื•ื“ ืฉืœ ื”"ื“ืฃ" ื”ื‘ื ื•ืœื”ืฆื™ื’ ืื•ืชื•. ื›ืžื•ื‘ืŸ ืฉื”ื ืžื˜ืคืœื™ื ื‘ืฉื‘ื™ืœื ื• ื‘ืœื—ื™ืฆื•ืช ืขืœ ื›ืคืชื•ืจ ืื—ื•ืจื” ื‘ื“ืคื“ืคืŸ ื•ื‘ืฉื™ื ื•ื™ ื›ืชื•ื‘ืช ื”ืขืžื•ื“ (ื‘ืฉื‘ื™ืœ ืกื™ืžื ื™ื•ืช ื•ืฉื™ืชื•ืฃ). ื‘ื ื•ืกืฃ Next ื™ืฉืžื•ืจ ื‘ื–ื™ื›ืจื•ืŸ ืžื˜ืžื•ืŸ ื‘ื“ืคื“ืคืŸ ืืช ื”ืชื•ืฆืื•ืช ืฉืงื™ื‘ืœ ืžื”ืฉืจืช ื›ืš ืฉื ื™ื•ื•ื˜ ืœื“ืคื™ื ืื—ื•ืจื” ื™ื”ื™ื” ืžื”ื™ืจ ื™ื•ืชืจ. ืืช ื”ื“ืคื™ื ืขืฆืžื ืื ื—ื ื• ืžื’ื“ื™ืจื™ื ื‘ืชื•ืจ ืชื™ืงื™ื•ืช ื—ื“ืฉื•ืช ื‘ืชื™ืงื™ื™ืช ื”ืคืจื•ื™ืงื˜ ื›ืืฉืจ ื‘ื›ืœ ืชื™ืงื™ื” ืฉืžื™ื™ืฆื’ืช ื“ืฃ ืฆืจื™ืš ืœื”ื™ื•ืช ืงื•ื‘ืฅ ื‘ืฉื page.tsx ืฉืื—ืจืื™ ืขืœ ื”ืชื•ื›ืŸ ืฉืœ ื”ื“ืฃ. ื‘ื•ืื• ื ื ืกื” ืืช ื–ื” ืขื ื”ืืคืœื™ืงืฆื™ื” ืฉื”ืชื—ืœื ื• ืœื›ืชื•ื‘ ื‘ื—ืœืงื™ื ื”ืงื•ื“ืžื™ื ืฉืœ ื”ืžื“ืจื™ืš. ื ื™ืฆื•ืจ ืชื™ืงื™ื” ื—ื“ืฉื” ื‘ืฉื about ื•ื‘ืชื•ื›ื” ืงื•ื‘ืฅ ื‘ืฉื page.tsx ืขื ื”ืชื•ื›ืŸ ื”ื‘ื:
export default () => {
  return (
    <div>
      <h1>About Us</h1>
      <p>This is an example lesson for using next.js router</p>
    </div>
  )
}
ืจืง ืขื“ ื›ืืŸ ื–ื” ืžืกืคื™ืง ื›ื“ื™ ืœืจืื•ืช ืืช ืฉื ื™ ื”ื“ืคื™ื ืฉืœื ื•. ื ื•ื•ื˜ื• ืœืฉืชื™ ื”ื›ืชื•ื‘ื•ืช:
http://localhost:3000
http://localhost:3000/about
ื›ื“ื™ ืœืจืื•ืช ืืช ืฉื ื™ ื”ื“ืคื™ื ืฉื™ืฆืจื ื•. ืžืขื‘ืจ ื‘ื™ืŸ ื“ืคื™ื ื ื•ืกื™ืฃ ืฉื•ืจืช ืชืคืจื™ื˜ ืขืœื™ื•ืŸ ื›ื“ื™ ืœืขื‘ื•ืจ ื‘ื™ืŸ ื”ื“ืคื™ื. ืฆืจื• ืงื•ื‘ืฅ ื—ื“ืฉ ื‘ืชื™ืงื™ื” ื”ืจืืฉื™ืช ื‘ืฉื menu.tsx ืขื ื”ืชื•ื›ืŸ ื”ื‘ื:
import Link from 'next/link';

export default () => {
  return (
    <nav className='flex my-4 border-4 border-indigo-200 border-l-indigo-500'>
      <Link href="/" className='flex-1 px-2'>Home</Link>
      <Link href="/about" className='flex-1 px-2'>About</Link>
    </nav>
  )
}
ื ื•ืกื™ืฃ ืืช ื”ืชืคืจื™ื˜ ื”ืขืœื™ื•ืŸ ืœืงื•ื‘ืฅ layout.tsx ื‘ืืžืฆืขื•ืช ื”ืฉื™ื ื•ื™ ื”ื‘ื:
import type { Metadata } from 'next'
import { Inter } from 'next/font/google'
import TopMenu from './menu';
import './globals.css'

const inter = Inter({ subsets: ['latin'] })

export const metadata: Metadata = {
  title: 'Create Next App',
  description: 'Generated by create next app',
}

export default function RootLayout({
  children,
}: {
  children: React.ReactNode
}) {
  return (
    <html lang="en">
      <body className={inter.className}>
        <TopMenu />
        {children}
      </body>
    </html>
  )
}

ืขื›ืฉื™ื• ื›ืฉื ื›ื ืก ืžื—ื“ืฉ ืœื“ืฃ ืื ื—ื ื• ืจื•ืื™ื ืชืคืจื™ื˜ ืขืœื™ื•ืŸ ืขื ืฉื ื™ ื”ืœื™ื ืงื™ื, ื•ื‘ื ื•ืกืฃ ืœื—ื™ืฆื” ืขืœ ื›ืœ ืื—ื“ ืžื”ืœื™ื ืงื™ื ืชื’ืจื•ื ืœืฉื™ื ื•ื™ ื”ื“ืฃ ื”ืคืขื™ืœ ื•ืœื”ืฆื’ืช ื”ื“ืฃ ืขืœื™ื• ืœื—ืฆื ื•. ื”ืฆื’ืช ื”ื“ืฃ ื”ื ื•ื›ื—ื™ ื‘ืฉื‘ื™ืœ ืœื”ื‘ื™ืŸ ืžื™ ื”ื“ืฃ ื”ื ื•ื›ื—ื™ ื•ืœืฉื ื•ืช ืืช ื”ืขื™ืฆื•ื‘ ืฉืœื• ื‘ืชืคืจื™ื˜ ืื ื—ื ื• ื™ื›ื•ืœื™ื ืœื”ืฉืชืžืฉ ื‘ Hooks ื‘ืฉื usePathname. ื”ืขื“ื›ื•ืŸ ื”ื‘ื ืœืงื•ืžืคื•ื ื ื˜ืช ื”ืชืคืจื™ื˜ ื™ื’ืจื•ื ืœื”ืฆื’ืช ืขื™ื’ื•ืœ ืงื˜ืŸ ืœื™ื“ ื”ื“ืฃ ื”ื ื•ื›ื—ื™ ื›ื“ื™ ืฉื ื“ืข ืื™ืคื” ืื ื—ื ื•:
"use client";
import Link from 'next/link';
import { usePathname } from 'next/navigation'

export default () => {
  const pathname = usePathname()
  return (
    <nav className='flex my-4 border-4 border-indigo-200 border-l-indigo-500'>
      <div className='flex-1 px-2'>
        <Link href="/" >Home</Link>
        {pathname == "/" &&
        <span className="ml-2 w-2 h-2 bg-blue-500 rounded-full inline-block"></span>
        }
        
      </div>
      <div className='flex-1 px-2'>
        <Link href="/about" >About</Link>
        {pathname == "/about" &&
        <span className="ml-2 w-2 h-2 bg-blue-500 rounded-full inline-block"></span>
        }
      </div>
    </nav>
  )
}
ืขื›ืฉื™ื• ืืชื 1. ื”ื•ืกื™ืคื• ื“ืฃ ื ื•ืกืฃ ืœืืคืœื™ืงืฆื™ื” ื‘ืฉื Contact ื•ื”ืฆื™ื’ื• ื‘ื• ื˜ื•ืคืก "ืฆื•ืจ ืงืฉืจ". ืฉื™ืžื• ืœื‘ ืœืขื“ื›ืŸ ืืช ื”ืชืคืจื™ื˜ ื›ื“ื™ ืœื”ืฆื™ื’ ืืช ืฉืœื•ืฉืช ื”ื“ืคื™ื.

ToCode
1 420
ื”ื ื” ืขื•ื“ ื›ืžื” ืžืฉื—ืงื™ื ืฉื›ื“ืื™ ืœื ืกื•ืช ืขื ืงื•ืžืคื•ื ื ื˜ื•ืช ืฆื“-ืฉืจืช ื•ืงื•ืžืคื•ื ื ื˜ื•ืช ืฆื“-ืœืงื•ื— ื›ื“ื™ ืœื”ื‘ื™ืŸ ื˜ื•ื‘ ื™ื•ืชืจ ืืช ื”ื”ื‘ื“ืœื™ื ื‘ื™ื ื™ื”ืŸ: 1. ื”ื•ืกื™ืคื• ืืช ื”ื•ื“ืขืช ื” console.log ืœื›ืœ ืื—ืช ืžืฉืœื•ืฉืช ื”ืงื•ืžืคื•ื ื ื˜ื•ืช ื•ืฉื™ืžื• ืœื‘ ืื™ืคื” ื”ื•ื“ืขืช ื”ื”ื“ืคืกื” ืžื•ืคื™ืขื” ื‘ื›ืœ ืงื•ืžืคื•ื ื ื˜ื”. 2. ื—ืฉื‘ื•: ืœืžื” ื”ื•ื“ืขื•ืช ื”ื”ื“ืคืกื” ืฉื›ืชื‘ื ื• ื‘ืงื•ืžืคื•ื ื ื˜ื•ืช ืฆื“-ืœืงื•ื— ืžื•ืคื™ืขื•ืช ื’ื ื‘ืงื•ื ืกื•ืœ ืฉืœ ื”ื“ืคื“ืคืŸ ื•ื’ื ื‘ื—ืœื•ืŸ ืฉื•ืจืช ื”ืคืงื•ื“ื”?

ToCode
1 420
ืงื•ืžืคื•ื ื ื˜ื•ืช ืฆื“-ืฉืจืช, ืงื•ืžืคื•ื ื ื˜ื•ืช ืฆื“-ืœืงื•ื— ื• State ื–ื•ื›ืจื™ื ืืช useState ืฉืœื ืขื‘ื“ ืœื ื• ื‘ืคืจืง ื”ืงื•ื“ื? ื‘ืคืจืง ื–ื” ื ื‘ื™ืŸ ืœืžื” ื•ื ืœืžื“ ืขื•ื“ ื˜ื™ืค ืขืœ ื”ืืจื›ื™ื˜ืงื˜ื•ืจื” ืฉืœ next.js. ืงื•ืžืคื•ื ื ื˜ืช ืฆื“-ืฉืจืช ื‘ืฉื‘ื™ืœ ืœืฉืคืจ ื‘ื™ืฆื•ืขื™ื ื”ืืจื›ื™ื˜ืงื˜ื•ืจื” ื”ื‘ืกื™ืกื™ืช ืฉืœ next.js ืžื—ืœืงืช ืืช ืงื•ืžืคื•ื ื ื˜ื•ืช ืจื™ืืงื˜ ืฉืื ื—ื ื• ื›ื•ืชื‘ื™ื ืœืงื•ืžืคื•ื ื ื˜ื•ืช ืฆื“-ืฉืจืช ื•ืงื•ืžืคื•ื ื ื˜ื•ืช ืฆื“-ืœืงื•ื—. ืงื•ืžืคื•ื ื ื˜ื•ืช ืฆื“-ืœืงื•ื— ื–ื” ืžื” ืฉืื ื—ื ื• ืžื›ื™ืจื™ื ืžืจื™ืืงื˜ "ื”ืจื’ื™ืœ" ืขื ืชื•ืกืคืช ืฉืœ SSR, ื›ืœื•ืžืจ ื”ืฉืจืช ืœื•ืงื— ืืช ื”ืงื•ืžืคื•ื ื ื˜ื”, ื”ื•ืคืš ืื•ืชื” ืœ HTML, ืฉื•ืœื— ืืช ื–ื” ืœื“ืคื“ืคืŸ ื™ื—ื“ ืขื ื” JavaScript ืฉืœ ื”ืงื•ืžืคื•ื ื ื˜ื” ืฉื ื”ื™ื ืขื•ื‘ืจืช ืจื™ื ื“ื•ืจ ื ื•ืกืฃ ื•ืงื•ื“ ื”ื˜ื™ืคื•ืœ ื‘ืื™ืจื•ืขื™ื "ืžืชืœื‘ืฉ" ืขืœ ื” HTML ืฉื ืฉืœื— ืžื”ืฉืจืช. ืงื•ืžืคื•ื ื ื˜ืช ืฆื“ ืฉืจืช ื”ื™ื ื‘ืกืš ื”ื›ืœ ืจืขื™ื•ืŸ ื“ื•ืžื” ื—ื•ืฅ ืžื–ื” ืฉืžื•ื•ืชืจื™ื ืขืœ ื”ื—ืœืง ืฉืœ ืœืฉืœื•ื— ืืช ื” JavaScript ืœื“ืคื“ืคืŸ ื•ืœืจื ื“ืจ ืืช ื”ืงื•ืžืคื•ื ื ื˜ื” ืฉื•ื‘ ื‘ืฆื“ ื”ืœืงื•ื—, ื›ืœื•ืžืจ ื ืฉืืจื™ื ืจืง ืขื HTML ืฉื ืฉืœื— ืžื”ืฉืจืช ืœืœืงื•ื—. ืžืชื•ืš ื”ืืจื›ื™ื˜ืงื˜ื•ืจื” ื”ืฉื•ื ื” ื ื’ื–ืจื•ืช ื’ื ื”ื™ื›ื•ืœื•ืช ื”ืฉื•ื ื•ืช: 1. ืงื•ืžืคื•ื ื ื˜ื•ืช ืฆื“-ืœืงื•ื— ื™ื›ื•ืœื•ืช ืœื”ืฉืชืžืฉ ื‘ State, ื›ื™ื•ื•ืŸ ืฉื“ื‘ืจื™ื ื™ื›ื•ืœื™ื ืœืงืจื•ืช ื•ืœืฉื ื•ืช ืืช ืžื” ืฉืžื•ืฆื’ ืœืžืฉืชืžืฉ. 2. ืงื•ืžืคื•ื ื ื˜ื•ืช ืฆื“-ืฉืจืช ืœื ื™ื›ื•ืœื•ืช ืœื”ืฉืชืžืฉ ื‘ State, ื›ื™ ืื™ืŸ ืœื”ืŸ ื“ืจืš ืœื”ื•ืกื™ืฃ ืงื•ื“ ื˜ื™ืคื•ืœ ื‘ืื™ืจื•ืขื™ื. ืžืฆื“ ืฉื ื™ ืงื•ืžืคื•ื ื ื˜ื•ืช ืฆื“-ืฉืจืช ื™ื›ื•ืœื•ืช ืœื’ืฉืช ื‘ืฆื•ืจื” ื™ืฉื™ืจื” ืœื‘ืกื™ืก ื”ื ืชื•ื ื™ื ืื• ืœืžืขืจื›ืช ื”ื”ืคืขืœื” ืฉืœ ื”ืฉืจืช, ื›ื™ ื”ืงื•ื“ ืจืฅ ืขืœ ื”ืฉืจืช ื‘ืœื‘ื“. ื”ืงื•ืžืคื•ื ื ื˜ื” page.tsx ืฉื›ืชื‘ื ื• ื‘ืฉื™ืขื•ืจ ื”ืคืชื™ื—ื” ื”ื™ืชื” ืงื•ืžืคื•ื ื ื˜ืช ืฆื“ ืฉืจืช, ื›ื™ ื–ื• ื‘ืจื™ืจืช ื”ืžื—ื“ืœ ืฉืœ ืงื•ืžืคื•ื ื ื˜ื•ืช ื‘ next.js. ื‘ืฉื‘ื™ืœ ืœื”ื•ืกื™ืฃ ืœื” State ืื ื™ ืฆืจื™ืš ืœื”ืคื•ืš ืื•ืชื” ืœืงื•ืžืคื•ื ื ื˜ื” ืฆื“-ืœืงื•ื— ื‘ืขื–ืจืช ื”ื•ืกืคืช ื”ืฉื•ืจื”:
"use client";
ื‘ืจืืฉ ื”ืงื•ื‘ืฅ. ืœื“ื•ื’ืžื” ืื›ืชื•ื‘ ืืช ื”ืชื•ื›ืŸ ื”ื‘ื ื‘ืงื•ื‘ืฅ page.tsx ื›ื“ื™ ืœื”ืฆื™ื’ ืงื•ืžืคื•ื ื ื˜ื” ืฉืœ ืžื•ื ื” ืœื—ื™ืฆื•ืช:
"use client";
import Image from 'next/image'
import { useState } from 'react';


export default function Home() {
  const [count, setCount] = useState(0);
  return (
    <main className="flex min-h-screen flex-col items-center justify-between p-24">
      <button onClick={() => setCount(c => c + 1)}>{count}</button>
    </main>
  )
}
ืืคืฉืจ ื’ื ืœืคืฆืœ ืืช ื”ืงื•ืžืคื•ื ื ื˜ื” ืœื›ืžื” ืงื•ืžืคื•ื ื ื˜ื•ืช ื›ื“ื™ ืœืฉื™ื ืžืกืคืจ ืžื•ื ื™ื ืขืœ ื”ืžืกืš:
"use client";
import { useState } from 'react';

const Counter = () => {
  const [count, setCount] = useState(0);
  return <button onClick={() => setCount(c => c + 1)}>{count}</button>
}

export default function Home() {
  
  return (
    <main className="flex min-h-screen flex-col items-center justify-between p-24">
      <Counter />
      <Counter />
      <Counter />
    </main>
  )
}
ืฉื™ืœื•ื‘ ืงื•ืžืคื•ื ื ื˜ื•ืช ืฆื“-ืฉืจืช ืขื ืงื•ืžืคื•ื ื ื˜ื•ืช ืฆื“-ืœืงื•ื— ื‘ื•ืื• ื ืขืฉื” ืขื•ื“ ื ื™ืกื•ื™, ื ื•ืฆื™ื ืืช Counter ืœืงื•ื‘ืฅ ืื—ืจ ื‘ืฉื counter.tsx ื•ืื– ื‘ืงื•ื‘ืฅ page.tsx ื ืฉืื™ืจ ืจืง ืืช ื”ืงื•ื“ ื”ื‘ื:
import Counter from './counter'
export default function Home() {
  
  return (
    <main className="flex min-h-screen flex-col items-center justify-between p-24">
      <Counter />
      <Counter />
      <Counter />
    </main>
  )
}
ื–ื” ืื’ื‘ ื™ื”ื™ื” ื”ืงื•ื“ ื‘ counter.tsx:
"use client";
import { useState } from 'react';

export default () => {
  const [count, setCount] = useState(0);
  return <button onClick={() => setCount(c => c + 1)}>{count}</button>
}
ื›ื™ืฃ ืœืฉื™ื ืœื‘ ืฉืื™ืŸ ืœ next ืฉื•ื ื‘ืขื™ื” ื›ืฉืื ื™ ืžืฉืœื‘ ืงื•ืžืคื•ื ื ื˜ื•ืช ืฆื“-ืœืงื•ื— ื‘ืชื•ืš ืงื•ืžืคื•ื ื ื˜ื•ืช ืฆื“-ืฉืจืช. ืงื•ืžืคื•ื ื ื˜ื•ืช ืฆื“ ื”ืœืงื•ื— ื™ื™ืฉืœื—ื• ืœื“ืคื“ืคืŸ ื•ื™ืจื•ื ื“ืจื• ื’ื ืฉื, ื‘ืขื•ื“ ืฉื”ื—ืœืงื™ื ืฉื”ื ืงื•ืžืคื•ื ื ื˜ื•ืช ืฆื“ ืฉืจืช ื™ืจื•ื ื“ืจื• ืจืง ื‘ืฆื“ ื”ืฉืจืช. ืžืฆื‘ ื”ืคื•ืš ื”ื•ื ืงืฆืช ื™ื•ืชืจ ืžืกื•ื‘ืš. ื ื™ืฆื•ืจ ืงื•ื‘ืฅ ื‘ืฉื header.tsx ืขื ื”ืชื•ื›ืŸ ื”ื‘ื:
export default () => (<h1>Counter Header</h1>);
ื•ื ืขื“ื›ืŸ ืืช counter.tsx ื›ืš ืฉื™ื›ื™ืœ ืืช ื”ืงื•ื“:
"use client";
import { useState } from 'react';
import Header from './header';

export default () => {
  const [count, setCount] = useState(0);
  return (
    <div>
      <Header />
      <button onClick={() => setCount(c => c + 1)}>{count}</button>
    </div>
  )
}
ืœืžืจื•ืช ืฉ header.tsx ืœื ื›ื•ืœืœ ืืช ื”ื›ื•ืชืจืช use client ื”ื•ื ืขื“ื™ื™ืŸ ืงื•ืžืคื•ื ื ื˜ืช ืฆื“-ืœืงื•ื—, ื‘ื’ืœืœ ืฉืขืฉื™ืชื™ ืœื• import ืžืชื•ืš ืงื•ืžืคื•ื ื ื˜ืช ืฆื“-ืœืงื•ื—. ื“ืจืš ืงืœื” ืœื”ื™ื•ื•ื›ื— ื‘ื–ื” ื”ื™ื ืœื”ื•ืกื™ืฃ console.log ื‘ืชื•ืš ื”ืงื•ืžืคื•ื ื ื˜ื” ื•ืœืจืื•ืช ืื ื”ื”ื“ืคืกื” ืžื•ืคื™ืขื” ื’ื ื‘ืงื•ื ืกื•ืœ ืฉืœ ื”ื“ืคื“ืคืŸ ื•ื’ื ื‘ื—ืœื•ืŸ ืฉื•ืจืช ื”ืคืงื•ื“ื”, ืื• ืจืง ื‘ื—ืœื•ืŸ ืฉื•ืจืช ื”ืคืงื•ื“ื”. ืขื›ืฉื™ื• ืืชื

ToCode
1 420
3. ื”ืงื•ื“ ื‘ page.tsx ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื‘ import ื›ื“ื™ ืœื˜ืขื•ืŸ ืงื•ืžืคื•ื ื ื˜ื•ืช ืžืงื‘ืฆื™ื ืื—ืจื™ื. ืฆืจื• ื‘ืงื•ื‘ืฅ ืื—ืจ ืงื•ืžืคื•ื ื ื˜ื” ืœืชืคืจื™ื˜ ืขืœื™ื•ืŸ ื•ื”ื•ืกื™ืคื• ืื•ืชื” ืœืขืžื•ื“ ืขื import. 4. ื ืกื• ืœื”ื•ืกื™ืฃ ืœืื—ืช ื”ืงื•ืžืคื•ื ื ื˜ื•ืช ืงืจื™ืื” ืœ useState ื•ืฉื™ืžื• ืœื‘ ืœืฉื’ื™ืื” ืฉืžื•ืฆื’ืช ืขืœ ื”ืขืžื•ื“. ืฉื—ืงื• ืขื ื–ื” ื›ื“ื™ ืœื”ื‘ื™ืŸ ืื™ื–ื” hooks ืขื•ื‘ื“ื™ื ื•ืื™ื–ื” ืœื.

ToCode
1 420
src="/next.svg"
          alt="Next.js Logo"
          width={180}
          height={37}
          priority
        />
      </div>

      <div className="mb-32 grid text-center lg:max-w-5xl lg:w-full lg:mb-0 lg:grid-cols-4 lg:text-left">
        <a
          href="https://nextjs.org/docs?utm_source=create-next-app&utm_medium=appdir-template&utm_campaign=create-next-app"
          className="group rounded-lg border border-transparent px-5 py-4 transition-colors hover:border-gray-300 hover:bg-gray-100 hover:dark:border-neutral-700 hover:dark:bg-neutral-800/30"
          target="_blank"
          rel="noopener noreferrer"
        >
          <h2 className={\mb-3 text-2xl font-semibold\}>
            Docs{' '}
            <span className="inline-block transition-transform group-hover:translate-x-1 motion-reduce:transform-none">
              -&gt;
            </span>
          </h2>
          <p className={\m-0 max-w-[30ch] text-sm opacity-50\}>
            Find in-depth information about Next.js features and API.
          </p>
        </a>

        <a
          href="https://nextjs.org/learn?utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
          className="group rounded-lg border border-transparent px-5 py-4 transition-colors hover:border-gray-300 hover:bg-gray-100 hover:dark:border-neutral-700 hover:dark:bg-neutral-800/30"
          target="_blank"
          rel="noopener noreferrer"
        >
          <h2 className={\mb-3 text-2xl font-semibold\}>
            Learn{' '}
            <span className="inline-block transition-transform group-hover:translate-x-1 motion-reduce:transform-none">
              -&gt;
            </span>
          </h2>
          <p className={\m-0 max-w-[30ch] text-sm opacity-50\}>
            Learn about Next.js in an interactive course with&nbsp;quizzes!
          </p>
        </a>

        <a
          href="https://vercel.com/templates?framework=next.js&utm_source=create-next-app&utm_medium=appdir-template&utm_campaign=create-next-app"
          className="group rounded-lg border border-transparent px-5 py-4 transition-colors hover:border-gray-300 hover:bg-gray-100 hover:dark:border-neutral-700 hover:dark:bg-neutral-800/30"
          target="_blank"
          rel="noopener noreferrer"
        >
          <h2 className={\mb-3 text-2xl font-semibold\}>
            Templates{' '}
            <span className="inline-block transition-transform group-hover:translate-x-1 motion-reduce:transform-none">
              -&gt;
            </span>
          </h2>
          <p className={\m-0 max-w-[30ch] text-sm opacity-50\}>
            Explore starter templates for Next.js.
          </p>
        </a>

        <a
          href="https://vercel.com/new?utm_source=create-next-app&utm_medium=appdir-template&utm_campaign=create-next-app"
          className="group rounded-lg border border-transparent px-5 py-4 transition-colors hover:border-gray-300 hover:bg-gray-100 hover:dark:border-neutral-700 hover:dark:bg-neutral-800/30"
          target="_blank"
          rel="noopener noreferrer"
        >
          <h2 className={\mb-3 text-2xl font-semibold\}>
            Deploy{' '}
            <span className="inline-block transition-transform group-hover:translate-x-1 motion-reduce:transform-none">
              -&gt;
            </span>
          </h2>
          <p className={\m-0 max-w-[30ch] text-sm opacity-50\}>
            Instantly deploy your Next.js site to a shareable URL with Vercel.
          </p>
        </a>
      </div>
    </main>
  )
}
ื”ืฆืขื•ืช ืœืชืจื’ื•ืœ ื”ืงื•ื‘ืฅ layout.tsx ื›ื•ืœืœ ื”ื’ื“ืจื•ืช ื›ืœืœื™ื•ืช ืœืขืžื•ื“ ื•ื”ืงื•ื‘ืฅ page.tsx ื›ื•ืœืœ ืืช ืงื•ื“ ืงื•ืžืคื•ื ื ื˜ืช ืจื™ืืงื˜ ืฉืœ ื”ืขืžื•ื“. 1. ืฆืจื• ืคืจื•ื™ืงื˜ next.js ื—ื“ืฉ ื•ื”ืคืขื™ืœื• ืืช ืฉืจืช ื”ืคื™ืชื•ื—. 2. ืขื“ื›ื ื• ืืช ื”ืงื•ื“ ื‘ page.tsx ื›ื“ื™ ืฉื™ืฆื™ื’ ื”ื•ื“ืขืช ืคืชื™ื—ื” ืฉืœื›ื, ื•ืฉื™ืžื• ืœื‘ ืื™ืš ื”ืงื•ื“ ืžืชืขื“ื›ืŸ ื‘ื–ืžืŸ ืืžืช ืขืœ ื”ืžืกืš.