Brainwave教程
发表于:2026-06-11 | 分类: Next.js16教程
字数统计: 1.4k | 阅读时长: 6分钟 | 阅读量: 0
Button组件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import ButtonSvg from "@/assets/svg/ButtonSvg";

type ButtonProps = {
className?: string;
href?: string;
onClick?: () => void;
children: React.ReactNode;
px?: string;
white?: boolean;
};

export default function Button({
className,
href,
onClick,
children,
px,
white
}: ButtonProps) {
const classes = `
button
relative inline-flex items-center justify-center
h-11
transition-colors
hover:text-color-1
${px || "px-7"}
${white ? "text-n-8" : "text-n-1"}
${className || ""}
`;
const spanClasses = "relative z-10";
const Tag = href ? "a" : "button";
return (
<Tag className={classes} href={href} onClick={onClick}>
<span className={spanClasses}>{children}</span>
{ButtonSvg(white)}
</Tag>
);
}

知识点:
  • 类型定义
1
2
3
type ButtonProps = {}
//无返回值的函数
onClick?: () => void;

  • h-11
    11 = 对应间距刻度,1 单位 = 0.25rem,h-11就是2.75rem,44px
  • 模板字符串
    模板字符串是 JavaScript 里一种升级版字符串写法,专门用来解决「普通字符串拼接麻烦、换行不方便」的问题,写法是用反引号 `
    嵌入变量 ${}:在模板字符串里用  ${变量/计算/函数} ,可以直接把动态内容插进去,替代繁琐的  +  拼接。
  • ${ }
    模板字符串的插值语法,里面可以写 JS 表达式,最终把结果拼成字符串。
  • {ButtonSvg(white)}
    是一个专门返回 SVG 图形的函数(不是 React 组件,所以写法是  ButtonSvg(white)  调用,而非   )。
    按钮的自定义外观、背景、边框、异形轮廓、装饰图形
    视觉层级:做底层背景,不遮挡文字
  • @theme 定义自定义颜色
    CSS文件中用  @theme  定义  –color-*  变量,自动生成工具类(如  bg-brand-500 、 text-primary )
  • color-scheme: dark详解
    这是 CSS 原生配色模式属性,用于适配系统/浏览器的深色/浅色模式。
    自动改变浏览器原生控件样式:滚动条、表单、按钮、输入框、下拉框、系统弹窗等
    /_ 放在根元素,全局生效 _/
1
2
3
:root{
color-scheme: dark;
}

  • @media (prefers-color-scheme)
    这是 CSS 媒体查询,用来读取用户系统/浏览器当前的主题模式(深色/浅色),自动匹配样式。
    纯 CSS 实现无感自动换肤,不用 JS
    prefers-color-scheme: light
    系统开启浅色/白天模式时生效
1
2
3
@media (prefers-color-scheme: light) {
/* 浅色样式写这里 */
}
  • prefers-color-scheme: dark
  • 系统开启深色/夜间模式时生效
1
2
3
4
@media (prefers-color-scheme: dark) {
/* 深色样式写这里 */
}


  • @utility 
    是 Tailwind CSS v4 新增的核心指令,专门用来创建自定义工具类(Utilities),让你可以像使用内置类(比如  text-center 、 backdrop-blur-sm )一样,定义自己的样式工具类,同时获得完整的变体支持(hover、focus、响应式等)
    定义新的原子工具类用  @utility ,组合现有类写组件用  @apply
    动态值工具类(支持任意值)
1
2
3
4
5
@utility my-* {
margin-top: --value(--spacing);
margin-bottom: --value(--spacing);
}



Header组件:
知识点:
1
2
3
4
<Link href="/heavy-page" prefetch={false}>
不预取的页面
</Link>

  1.  replace (替换历史,默认  false )
1
2
3
4
<Link href="/login" replace>
登录(替换历史)
</Link>

  1.  scroll (滚动复位,默认  true )
  1.  onNavigate (跳转回调,16+ 新增)
1
2
3
4
5
6
7
8
9
10
<Link
href="/checkout"
onNavigate={(e) => {
console.log('跳转前', e)
// e.preventDefault() // 取消跳转
}}
>
去结算

</Link>

跳转前触发,可用于埋点、拦截、取消导航 。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import Image from 'next/image'
import productImg from '@/public/product.jpg' // 静态导入

export default function Product() {
return (
<Image
preload={true}
src={productImg} // 直接使用导入对象
alt="产品详情图"
placeholder="blur" // 模糊占位
/>
)
}

  1. 远程图片(需配置)

在  next.config.js  声明信任域名:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/** @type {import('next').NextConfig} */
const nextConfig = {
images: {
remotePatterns: [
{
protocol: "https",
hostname: "images.unsplash.com", // 允许的域名
port: "",
pathname: "/photo-**" // 路径匹配规则
}
]
}
};

module.exports = nextConfig;
1
2
3
4
5
6
7
declare interface NavItem {
id: string;
title: string;
url: string;
onlyMobile?: boolean;
}

上一篇:
Go语言指针
下一篇:
Tailwind教程