nextjsnext.js翻译
Monday, May 8, 2023
plain text
npm i next@latest react@latest react-dom@latest eslint-config-next@latest
typescript
// Pages Router
// pages/about.js
import React from 'react';
export default () => <h1>About us</h1>;
typescript
// 新:应用路由器✨
// app/layout.js
export default function RootLayout({ children }) {
return (
<html lang="en">
<body>{children}</body>
</html>);
}
// app/page.js
export default function Page() {
return <h1>Hello, Next.js!</h1>;
}
typescript
// Pages Router
// pages/_app.js
//此“全局布局”包装所有路由。无法
//组合其他布局组件,并且您无法从此文件获取全局数据。
export default function MyApp({ Component,pageProps }) {
return <Component {...pageProps} />;
}
typescript
// 新:应用路由器✨
// app/layout.js
//
//整个应用程序共享根布局
export default function RootLayout({ children }) {
return (
<html lang="en">
<body>{children}</body>
</html>);
}
// app/dashboard/layout.js
//
//布局可以嵌套和组合
export default function DashboardLayout({ children }) {
return (
<section>
<h1>Dashboard</h1>
{children}
</section>);
}
typescript
// Pages Router
// pages/_document.js
//此文件允许您自定义<html>和<body>标记
//用于服务器请求,但添加了特定于框架的功能
//而不是编写HTML元素。
import { Html,Head,Main,NextScript } from 'next/document';
export default function Document() {
return (
<Html>
<Head />
<body>
<Main />
<NextScript />
</body>
</Html>);
}
typescript
// 新:应用路由器✨
// app/layout.js
//
//整个应用程序共享根布局
export default function RootLayout({ children }) {
return (
<html lang="en">
<body>{children}</body>
</html>);
}
typescript
import React from 'react';
import Head from 'next/head';
export default () => (
<div>
<Head>
<meta name="viewport" content="width=device-width, initial-scale=1" />
</Head>
<h1>Hi. I'm mobile-ready!</h1>
</div>);
typescript
import React from 'react';
import 'isomorphic-fetch';
export default class extends React.Component {
static async getInitialProps() {
const res = await fetch('<https://api.company.com/user/123>');
const data = await res.json();
return { username: data.profile.username };
}
}
typescript
// 生成路由的静态版本
export async function getStaticProps(context) {
return { props: {} };
}
// 或者动态服务器呈现路由
export async function getServerSideProps(context) {
return { props: {} };
}
typescript
// app/page.js
export default async function Page() {
const res = await fetch('<https://api.example.com/>...');
// 返回值不会被序列化
// 您可以使用 Date、Map、Set 等。
const data = res.json();
return '...';
}
typescript
// app/page.js
import { Tweet } from 'react-tweet';
export default async function Page() {
return <Tweet id="790942692909916160" />;
}
typescript
// app/page.js
import { Suspense } from 'react';
import { PostFeed, Weather } from './components';
export default function Page() {
return (
<section>
<Suspense fallback={<p>Loading feed...</p>}>
<PostFeed />
</Suspense>
<Suspense fallback={<p>Loading weather...</p>}>
<Weather />
</Suspense>
</section>);
}
typescript
// app/page.tsx
import dynamic from 'next/dynamic';
const DynamicHeader = dynamic(() => import('../components/header'), {
loading: () => <p>Loading...</p>,
});
export default function Home() {
return <DynamicHeader />;
}
typescript
// app/layout.tsx
import { getUser } from './auth';
import { Dashboard, Landing } from './components';
export default async function Layout() {
const isLoggedIn = await getUser();
return isLoggedIn ? <Dashboard /> : <Landing />;
}
typescript
// app/post/[id]/page.tsx (Server Component)
import kv from './kv';
export default function Page({ params }) {
async function increment() {
'use server';
await kv.incr(`post:id:${params.id}`);
}
return (
<form action={increment}>
<button type="submit">Like</button>
</form>);
}
typescript
// app/dashboard/posts/page.tsx (Server Component)
import db from './db';
import { redirect } from 'next/navigation';
async function create(formData: FormData) {
'use server';
const post = await db.post.insert({
title: formData.get('title'),
content: formData.get('content'),
});
redirect(`/blog/${post.slug}`);
}
export default function Page() {
return (
<form action={create}>
<input type="text" name="title" />
<textarea name="content" />
<button type="submit">Submit</button>
</form>);
}
typescript
// app/dashboard/posts/page.tsx (Server Component)
import db from './db';
import { revalidateTag } from 'next/cache';
async function update(formData: FormData) {
'use server';
await db.post.update({
title: formData.get('title'),
});
revalidateTag('posts');
}
export default async function Page() {
const res = await fetch('https://...', { next: { tags: ['posts'] } });
const data = await res.json();
// ...
}
typescript
/** @type {import('next').NextConfig} */
const nextConfig = {
experimental: {
serverActions: true,
},
};
module.exports = nextConfig;