ToCode
Kanalga Telegramโda oโtish
ืืืคืื ืงืฆืจืื ืืืชืื ืชืื ืืืช ืื ืื ืคืจืง
Ko'proq ko'rsatish1 420
Obunachilar
+124 soatlar
+17 kunlar
-430 kunlar
Postlar arxiv
1 420
ืืืจืืชื ืืช ืืืงืกื ืืืื ืื ืืื ืื ื ืื ืก ืืื ืืืืืจื ืขืืืฃ ืืืืื ืก ืืืื ืง ืืงืจืื ืืืืชืจ
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 () => {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 ืืงืืืคืื ื ืืช ืฆื ืืงืื ืชืืื ืืืฆืื ืืช ืืืืืข ืืฆืืจื ืืื ืืจืงืืืืืช ืชืื ืฉืืืืฉ ืืกืืืื. ืืฉืืืชื ืงืืืคืื ื ืืช ืฆื ืืงืื ืชืฆืืจื ืืขืืื ืืืจื ืืช ืืฉืจืช ื ืฉืชืืฉ ืืื ืื ืื ืฉืจืืื ื ืืคืจืง ืืงืืื ืฉื ืืืืจืื ืืื ืืขืืืื ืืืจืื ืืจืืขื ืื ืฉื ืงืืืคืื ื ืืืช ืฆื ืืฉืจืช ืฉืืขืืื ืืืืืื ืืืืืืข ืืฉืชื ื ืื ืงืืืคืื ื ืืืช ืฆื ืืืงืื ืืงืืื ืคืจืืคืก ืืืฉืื ืืืฆืืื ืืช ืืชืืื ืืืขืืืื ืขื ืืืกื.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 &&1 420
ืืฉืืง ืืื ืขื ืืงืื ืื ืงืืื ืืืืช ืืืื ืืืืกืืฃ ืขืื ืคืขืืืืช ืขื ืืคืืกืืื - ื ืกื ืืืืกืืฃ ืืคืฉืจืืืืช ืืขืจืืื ืืืืืงื ืฉื ืคืืกืืื. ืืืจื ืฉืื ืขืืื ืืืกืืคื ืงืืืคืื ื ืื ืืืฉื ืฉืืฆืืื ืืช ืืกืคืจ ืืคืืกืืื ืืขืืื ืืฉืืื ืื ืฉืืืืืข ืฉืื ืืชืจืขื ื ืื ืคืขื ืฉืืชื ืืืกืืคืื ืื ืืืืงืื ืคืืกื.
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>
)
}
ืขืืฉืื ืืชื1 420
2. ืืืื ื ืฉืืง ืขื ืื ืื ืื ื Cache ืฉื ื ืงืกื - ืืืกืืคื ืขืืื ื ืืกืฃ ืฉืืฆืื ืืช ืืชืืจืื ืืฉืขื ืื ืืืืืื ืขื new Date. ื ืกื ืื ืืื ืืืื ืืจื ืืชืคืจืื ืืฉืืื ืื ืืชื ืืขืจื ืืฉืชื ื. ื ืกื ืื ืืจืขื ื ืืช ืืขืืื ืขื F5 ืืฉืืื ืื ืืฉืื ืืืื.
3. ืืืฆืืื ืืช ื Link ืืื ืขื ืืขืืืื ืฉืื ืืงืืืคืื ื ืื ื ืคืจืืช ืืื ืฉืชืืืื ืืืคืื ืืช ืงืืืคืื ื ืืช ืืชืคืจืื ืืืจื ืืงืืืคืื ื ืืช ืฆื-ืฉืจืช.
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 ืืืฆืืื ืื ืืืคืก "ืฆืืจ ืงืฉืจ". ืฉืืื ืื ืืขืืื ืืช ืืชืคืจืื ืืื ืืืฆืื ืืช ืฉืืืฉืช ืืืคืื.1 420
ืื ื ืขืื ืืื ืืฉืืงืื ืฉืืืื ืื ืกืืช ืขื ืงืืืคืื ื ืืืช ืฆื-ืฉืจืช ืืงืืืคืื ื ืืืช ืฆื-ืืงืื ืืื ืืืืื ืืื ืืืชืจ ืืช ืืืืืืื ืืื ืืื:
1. ืืืกืืคื ืืช ืืืืขืช ื console.log ืืื ืืืช ืืฉืืืฉืช ืืงืืืคืื ื ืืืช ืืฉืืื ืื ืืืคื ืืืืขืช ืืืืคืกื ืืืคืืขื ืืื ืงืืืคืื ื ืื.
2. ืืฉืื: ืืื ืืืืขืืช ืืืืคืกื ืฉืืชืื ื ืืงืืืคืื ื ืืืช ืฆื-ืืงืื ืืืคืืขืืช ืื ืืงืื ืกืื ืฉื ืืืคืืคื ืืื ืืืืื ืฉืืจืช ืืคืงืืื?
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 ืืชืื ืืงืืืคืื ื ืื ืืืจืืืช ืื ืืืืคืกื ืืืคืืขื ืื ืืงืื ืกืื ืฉื ืืืคืืคื ืืื ืืืืื ืฉืืจืช ืืคืงืืื, ืื ืจืง ืืืืื ืฉืืจืช ืืคืงืืื.
ืขืืฉืื ืืชื1 420
3. ืืงืื ื page.tsx ืืืื ืืืฉืชืืฉ ื import ืืื ืืืขืื ืงืืืคืื ื ืืืช ืืงืืฆืื ืืืจืื. ืฆืจื ืืงืืืฅ ืืืจ ืงืืืคืื ื ืื ืืชืคืจืื ืขืืืื ืืืืกืืคื ืืืชื ืืขืืื ืขื import.
4. ื ืกื ืืืืกืืฃ ืืืืช ืืงืืืคืื ื ืืืช ืงืจืืื ื useState ืืฉืืื ืื ืืฉืืืื ืฉืืืฆืืช ืขื ืืขืืื. ืฉืืงื ืขื ืื ืืื ืืืืื ืืืื hooks ืขืืืืื ืืืืื ืื.
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">
->
</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">
->
</span>
</h2>
<p className={\m-0 max-w-[30ch] text-sm opacity-50\}>
Learn about Next.js in an interactive course with 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">
->
</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">
->
</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 ืืื ืฉืืฆืื ืืืืขืช ืคืชืืื ืฉืืื, ืืฉืืื ืื ืืื ืืงืื ืืชืขืืื ืืืื ืืืช ืขื ืืืกื.
Endi mavjud! Telegram Tadqiqoti 2025 โ yilning asosiy insaytlari 
