next.js-学习2

news/2025/2/25 18:22:52

next.js-学习2

    • 1. https://nextjs.org/learn/dashboard-app/getting-started
    • 2. 模拟的数据
    • 3. 添加样式
    • 4. 字体,图片
    • 5. 创建布局和页面
    • 页面导航

目录

1. https://nextjs.org/learn/dashboard-app/getting-started

  • /app: Contains all the routes, components, and logic for your application, this is where you’ll be mostly working from.
  • /app/lib: Contains functions used in your application, such as reusable utility functions and data fetching functions.
  • /app/ui: Contains all the UI components for your application, such as cards, tables, and forms. To save time, we’ve pre-styled these components for you.
  • /public: Contains all the static assets for your application, such as images.
  • Config Files: You’ll also notice config files such as next.config.ts at the root of your application. Most of these files are created and pre-configured when you start a new project using create-next-app. You will not need to modify them in this course.

2. 模拟的数据

app/lib/placeholder-data.ts 这些是模拟的数据

3. 添加样式

  1. /app/layout.tsx中加入**import ‘@/app/ui/global.css’;**支持全局样式,global.css中@tailwind是css框架

  2. 在代码中加@tailwind样式

    <h1 className="text-blue-500">I'm blue!</h1>
    <div
      className="relative w-0 h-0 border-l-[15px] border-r-[15px] border-b-[26px] border-l-transparent border-r-transparent border-b-black"
    />
    

    如果是不想直接加可以封装个css类引用,创建文件/app/ui/home.module.css,写入

    .shape {
      height: 0;
      width: 0;
      border-bottom: 30px solid black;
      border-left: 20px solid transparent;
      border-right: 20px solid transparent;
    }
    

    在/app/page.tsx中导入import styles from ‘@/app/ui/home.module.css’;

    使用

    ,这样可以有效的隔离样式的侵入性

    动态设置样式,/app/ui/invoices/status.tsx中的clx,可以根据传入的status动态显示样式,代码如下:

import clsx from 'clsx';
 
export default function InvoiceStatus({ status }: { status: string }) {
  return (
    <span
      className={clsx(
        'inline-flex items-center rounded-full px-2 py-1 text-sm',
        {
          'bg-gray-100 text-gray-500': status === 'pending',
          'bg-green-500 text-white': status === 'paid',
        },
      )}
    >
    // ...
)}

4. 字体,图片

/app/ui/fonts.ts 如果自己加字体浏览器会二次渲染,布局变化可能会影响性能,如果是用next/font在初始化加载的时候字体会嵌入进去,不会二次渲染,性能提升。

添加谷歌字体,创建文件/app/ui/fonts.ts

import { Inter } from 'next/font/google';
 
export const inter = Inter({ subsets: ['latin'] });

//增加第二种字体
import { Lusitana } from 'next/font/google';

export const lusitana = Lusitana({
  subsets: ['latin'],
  weight: ['400', '700'], // Normal and bold weights
});

在/app/layout.tsx中使用

import '@/app/ui/global.css';
import { inter } from '@/app/ui/fonts'; //引入字体
export default function RootLayout({
  children,
}: {
  children: React.ReactNode;
}) {//使用字体
  return (
    <html lang="en">
      <body className={`${inter.className} antialiased`}>{children}</body>
    </html>
  );
}

在/app/page.tsx中使用

import { lusitana } from '@/app/ui/fonts'; //引入字体
//修改p标签的字体,这次页面字体整体变小了
 <p className={lusitana.className}>

加载图片,不同大小屏幕显示正常,优化加载,在/app/page.tsx中使用

原文参考:https://nextjs.org/learn/dashboard-app/optimizing-fonts-images#why-optimize-images

hidden md:block//在小屏幕(md 以下,比如手机)上,元素会 隐藏,因为 hidden 优先级较高。

当屏幕宽度达到 md 尺寸(通常是平板和桌面设备)及以上时,元素会 显示,且显示为块级元素(block)。

import Image from 'next/image';//引入图片
<Image
        src="/hero-desktop.png"
        width={1000}
        height={760}
        className="hidden md:block"//桌面可见
        alt="Screenshots of the dashboard project showing desktop version"
      />
      <Image
        src="/hero-mobile.png"
        width={1000}
        height={760}
        className="block md:hidden"//平板或者手机可见
        alt="Screenshots of the dashboard project showing desktop version"
      />

5. 创建布局和页面

layout.tsx:为多个页面提供共享布局。

page.tsx:为每个路由提供独特的页面内容

例如这种嵌套布局。举例: 如果你有一个管理页面,你可以在管理页面的 layout.tsx 中定义一个不同的布局(这里的布局也会用根布局的布局属性),而其他页面仍然使用根布局。

/app
  /layout.tsx         // 根布局
  /admin
    /layout.tsx       // 管理页面布局
    /dashboard/page.tsx
    /settings/page.tsx
  /home
    /page.tsx

创建:/app/dashboard/page.tsx,访问:http://localhost:3000/dashboard

export default function Page() {
  return <p>Dashboard Page</p>;
}

app结构

创建面板

/app/dashboard/customers/page.tsx

export default function Page() {
  return <p>Customers Page</p>;
}

/app/dashboard/invoices/page.tsx

export default function Page() {
  return <p>Invoices Page</p>;
}

/app/dashboard/layout.tsx 导入SideNav 组件到布局

import SideNav from '@/app/ui/dashboard/sidenav';
 
export default function Layout({ children }: { children: React.ReactNode }) {
  return (
    <div className="flex h-screen flex-col md:flex-row md:overflow-hidden">
      <div className="w-full flex-none md:w-64">
        <SideNav />
      </div>
      <div className="flex-grow p-6 md:overflow-y-auto md:p-12">{children}</div>
    </div>
  );
}

如图:

在这里插入图片描述

页面导航

/app/ui/dashboard/nav-links.tsx使用link标签替换a标签,这样点击导航就不会全局刷新了,避免了全局加载。

import Link from 'next/link';//添加link
a标签改为 </Link>标签

/app/ui/dashboard/nav-links.tsx使用usePathname和clsx让点击导航栏,动态显示点击的那个导航栏变蓝

'use client';//改为客户端组件,因为usePathname需要浏览器支持
import { usePathname } from 'next/navigation'; //使用usePathname
import clsx from 'clsx';
 const pathname = usePathname(); //NavLinks()使用
 //link中的className改为
 className={clsx(
              'flex h-[48px] grow items-center justify-center gap-2 rounded-md bg-gray-50 p-3 text-sm font-medium hover:bg-sky-100 hover:text-blue-600 md:flex-none md:justify-start md:p-2 md:px-3',
              {
                'bg-sky-100 text-blue-600': pathname === link.href,
              },
            )}

在这里插入图片描述


http://www.niftyadmin.cn/n/5865825.html

相关文章

C#开发——如何捕获异常和抛出异常

一、捕获异常 在 C#中&#xff0c;可以通过“try-catch”块捕获异常&#xff0c;并通过“is”关键字或“as”关键字来判断异常的具体类型。以下是几种常见的方法来判断异常类型&#xff1a; 方法 1&#xff1a;使用“catch”块直接捕获特定类型的异常 在 C#中&#xff0c;可以…

【react】进阶教程02

目录 一、深度性能优化 1. 列表渲染优化&#xff08;虚拟列表&#xff09; 2. 使用 Web Workers 处理 CPU 密集型任务 二、复杂状态管理场景 1. 全局状态分层&#xff08;Context useReducer&#xff09; 2. 异步状态管理中间件&#xff08;Redux Thunk&#xff09; 三、…

【NLP 37、激活函数 ③ relu激活函数】

—— 25.2.23 ReLU广泛应用于卷积神经网络&#xff08;CNN&#xff09;和全连接网络&#xff0c;尤其在图像分类&#xff08;如ImageNet&#xff09;、语音识别等领域表现优异。其高效性和非线性特性使其成为深度学习默认激活函数的首选 一、定义与数学表达式 ReLU&#xff0…

IDEA创建Spring配置文件Spring Config的方法

作为刚刚开始学Spring框架的小白&#xff0c;而且我也是刚刚学怎么用idea&#xff0c;不会简单的操作也是很正常的是吧。这个问题其实只是我傻傻的不懂&#xff0c;是个很简单的问题&#xff0c;我现在把它记录下来。 在idea创建maven项目后&#xff0c;我们在左边右键新建xml文…

[AI相关]问问DeepSeek如何基于Python,moviePy实现视频字幕功能

最多3个问题&#xff0c;必然命中目标 遇事不决先问问DeepSeek 我个人对Python和一些库&#xff0c;一些第三方工具都不是很了解的&#xff0c;所以&#xff0c; 问&#xff1a;”python videopy 能作什么"//不但英文写错了&#xff0c;中文应该都写错了。。。。 一如既…

作业day5

封装一个mystring类 拥有私有成员&#xff1a; char* p int len 需要让以下代码编译通过&#xff0c;并实现对应功能 mystring str "hello" mystring ptr; ptr.copy(str) ptr.append(str) ptr.show() 输出ptr代表的字符串 ptr.compare(str) 比较ptr和str是否一样 pt…

【关于seisimic unix中使用suedit指令无法保存问题】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、如何修改头文件二、出现的问题尝试解决使用ls显示文件属性使用chmod修改文件属性 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff…

【行业解决方案篇二】【当图神经网络成为“金融侦探”:DeepSeek反洗钱系统技术全解】

一、为什么传统反洗钱系统像“拿着渔网捞针”? 金融犯罪每年造成全球8万亿美元损失,而传统规则引擎存在三大致命伤: 规则滞后:依赖人工设定的固定阈值(如单日转账>50万触发警报),黑产通过“化整为零”轻松绕过关联缺失:仅分析单笔交易,无法识别多层嵌套的“资金迷…