【Next.js 项目实战系列】01-创建项目

news2024/11/29 20:45:20

原文链接

CSDN 的排版/样式可能有问题,去我的博客查看原文系列吧,觉得有用的话,给我的库点个star,关注一下吧 

创建项目

创建项目​

在创建项目中可以找到相关内容,这里不再赘述

First commit​

创建好项目之后,在 global.css 中删除 liner-gradient 相关内容

# /appglobal.css

  body {
    color: rgb(var(--foreground-rgb));
-   background: linear-gradient(
-       to bottom,
-       transparent,
-       rgb(var(--background-end-rgb))
-     ) rgb(var(--background-start-rgb));
  }

在 /app/page.tsx 中删除 Next.js 相关内容,仅返回一个 <>Hello World!<> 即可

# /app/page.tsx

export default function Home() {
  return (
    <>
      <h1>Hello World!</h1>
    </>
  );
}

完成以上步骤,即可进行第一次 commit

创建 NavBar​

本节代码链接

最简单的 NavBar 应该包含如下内容,包括一个 Logo 和几个 Link 用于导航。给他们都添加 flex 属性,即可横向布局,并添加一些边框,gap,垂直居中等样式

# NavBar.tsx

import Link from "next/link";

const NavBar = () => {
  return (
    <nav className="flex border-b mb-5 px-5 h-14">
      <Link href=""/>Logo</Link>
      <ul className="flex">
        <li><Link href="/">Dashboard</li>
        <li><Link href="/issues">Issues</li>
      </ul>
    </nav>
  );
};

export default NavBar;

react-icon​

然后我们使用 react-icon 来添加图标

npm i react-icon

在 react-icon 官网中找到想要的图标之后,可以直接 copy 代码使用

# NavBar.tsx

  import Link from "next/link";
  // import进来
+ import { AiFillBug } from "react-icons/ai";

  const NavBar = () => {
    return (
      <nav className="flex border-b mb-5 px-5 h-14">
      {/*直接像这样使用即可*/}
+       <Link href=""/><AiFillBug /></Link>
        <ul className="flex">
          <li><Link href="/">Dashboard</Link></li>
          <li><Link href="/issues">Issues</Link></li>
        </ul>
      </nav>
    );
  };

  export default NavBar;

为链接添加样式​

# NavBar.tsx

...
  <li className="text-zinc-500 hover:text-zinc-800 transaition-colors" ><Link href="/">Dashboard</Link></li>
...

如果链接多起来,我们需要一个个去添加样式。我们可以将所有的链接提取出来,放到一个 array 里面,再 map 为一个个的 <Link > 标签,以减少冗余代码

# NavBar.tsx

import Link from "next/link";
import { AiFillBug } from "react-icons/ai";

const NavBar = () => {
  const links = [
    { label: "DashBoard", href: "/dashboard" },
    { label: "Issues", href: "/issues" },
  ];

  return (
    <nav className="flex border-b mb-5 px-5 h-14">
      <Link href=""/><AiFillBug /></Link>
      <ul>
        {links.map((link) => (
            <Link
              className="text-zinc-500 hover:text-zinc-800 transaition-colors"
              key={link.href}
              href={link.href}
            >{link.label}</Link>
          ));
        }
      </ul>
    </nav>
  );
};

export default NavBar;

为当前页面 Link 添加样式​

比如我们目前在 /Issue 页面下,我们希望把这个链接凸显一下。首先我们需要使用 usePathname() 获取当前路径,然后我们在 links.map 中判断当前路径与 link.href 是否相等,若相等则应用另一个样式

# NavBar.tsx

  // 由于要获取用户端数据,使用 use client
+ "use client";
  import Link from "next/link";
  import { AiFillBug } from "react-icons/ai";
  // 导入 usePathname
+ import { usePathname } from "next/navigation";

  const NavBar = () => {
    // 获取当前路径
+   const currentPath = usePathname();

    const links = [
      { label: "DashBoard", href: "/dashboard" },
      { label: "Issues", href: "/issues" },
    ];

    return (
      <nav className="flex border-b mb-5 px-5 h-14">
        <Link href=""/><AiFillBug /></Link>
        <ul>
          {links.map((link) => (
              <Link
                className={
                  `${link.href === currentPath ? "text-zinc-900" : "text-zinc-500"}
                  hover:text-zinc-800 transaition-colors`}
                key={link.href}
                href={link.href}
              >{link.label}</Link>
            ));
          }
        </ul>
      </nav>
    );
  };

  export default NavBar;

但是随着判断条件越来越复杂,单行内代码越来越多,导致代码不宜于维护。这里使用 classnames 包来解决此问题,使用下面命令安装后,在代码内调用 classNames 函数,其参数为一个键值对,键为样式,值为一个 boolen 表达式,若值为 true 则代表应用该条样式,若为 false 则代表不应用该条样式

npm install classnames
# NavBar.tsx

import classNames from "classnames";

...
<Link
  className={classNames({
    "text-zinc-900": link.href === currentPath,
    "text-zinc-500": link.href !== currentPath,
    "hover:text-zinc-800 transaition-colors": true,
  })}
  key={link.href}
  href={link.href}
>
...

其他优化点​

最后,我们的代码应该尽量应用 oop 的原则,将部分内容抽象出来封装为函数,以提高代码可读性,可维护性

最终代码如下:

# NavBar.tsx

"use client";
import classNames from "classnames";
import Link from "next/link";
import { usePathname } from "next/navigation";
import { AiFillBug } from "react-icons/ai";

const NavBar = () => {
  return (
    <nav className="flex border-b mb-5 px-5 h-14">
      <NavLinks />
    </nav>
  );
};

export default NavBar;

const links = [
  { label: <AiFillBug />, href: "/" },
  { label: "DashBoard", href: "/dashboard" },
  { label: "Issues", href: "/issues" },
];

const NavLinks = () => {
  const currentPath = usePathname();

  return (
    <ul className="flex gap-6 items-center">
      {links.map((link) => (
        <Link
          className={classNames({
            "text-zinc-900": link.href === currentPath,
            "text-zinc-500": link.href !== currentPath,
            "hover:text-zinc-800 transaition-colors": true,
          })}
          key={link.href}
          href={link.href}
        >
          {link.label}
        </Link>
      ))}{" "}
    </ul>
  );
};

CSDN 的排版/样式可能有问题,去我的博客查看原文系列吧,觉得有用的话,给我的库点个star,关注一下吧 

下一篇讲创建 Issue

下一篇【Next.js 项目实战系列】02-创建 Issue

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2215669.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

40个IT运维加薪技术,每一个都含金量极高!运维必会的10个网络抓包/调试工具!系统崩溃的10种可能,运维人员必看!

40个IT运维加薪技术&#xff0c;每一个都含金量极高!运维必会的10个网络抓包/调试工具&#xff01;系统崩溃的10种可能&#xff0c;运维人员必看&#xff01; 在IT运维领域&#xff0c;想要加薪并不仅仅依赖于单一的技术&#xff0c;而是需要综合运用多种技能&#xff0c;不断提…

【LangChain】(一)掌握向量数据库的CRUD操作与语义检索技巧

文章目录 1. 向量数据库的基础知识1.1 为什么选择向量数据库&#xff1f; 2. CRUD操作详解2.1 向量数据库-新增数据示例代码&#xff1a; 2.2 向量数据库-删除数据示例代码&#xff1a; 2.3 向量数据库-更新数据2.4 向量数据库-查询数据2.4.1 相似度查询2.4.2 最大边际相关性查…

React(二) JSX中的this绑定问题;事件对象参数传递;条件渲染;列表渲染;JSX本质;购物车案例

文章目录 一、jsx事件绑定1. 回顾this的绑定方式2. jsx中的this绑定问题(1) 方式一&#xff1a;bind绑定(2) 方式二&#xff1a;使用 ES6 class fields 语法(3) 方式三&#xff1a;直接传入一个箭头函数(重要) 3.事件参数传递(1) 传递事件对象event(2) 传递其他参数 4. 事件绑定…

DeepBook V3和DEEP token正式上线

10月14日&#xff0c;DeepBook V3版本正式在主网上线&#xff0c;同时发布了DEEP token&#xff0c;标志着其发展历程中的一个重要里程碑。通过这次升级&#xff0c;用户和做市商将受益于精细调控的激励措施&#xff0c;为通过社区驱动的治理实现更大的去中心化奠定了基础。 D…

【大模型问答测试】大模型问答测试脚本实现(第一版)

背景 公司已经做了一段时间的大模型&#xff0c;每次测试或者回归的时候都需要针对问答进行测试回归&#xff0c;耗费大量的时间与精力&#xff0c;因此结合产品特点&#xff0c;开发自动化脚本替代人工的操作&#xff0c;提升测试回归效率 设计 使用pythonrequestExcel进行…

python+大数据+基于Spark的共享单车数据存储系统【内含源码+文档+部署教程】

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ &#x1f345;由于篇幅限制&#xff0c;想要获取完整文章或者源码&#xff0c;或者代做&am…

【jQuery】 jQuery基础及选择器介绍(基本选择器 层次选择器 属性选择器 过滤选择器)

文章目录 jQuery基础1. 优势2. 版本3. 基本语法4. 选择器基本选择器层次选择器属性选择器过滤选择器基本过滤选择器可见性过滤选择器 注意事项 jQuery基础 jQuery 是一个功能强大且易于使用的 JavaScript 库&#xff0c;它极大地简化了前端开发的工作。无论是 DOM 操作、事件处…

简单概述Ton链开发路径

区块链开发领域发展迅速&#xff0c;各种平台为开发人员提供不同的生态系统。其中一个更有趣且越来越相关的区块链是TON&#xff08;开放网络&#xff09;区块链。TON 区块链最初由 Telegram 构思&#xff0c;旨在提供快速、安全且可扩展的去中心化应用程序 (dApp)。凭借其独特…

加盟模式如何运营?有哪些好的技巧和方法!

对于很多品牌方来说&#xff0c;生意发展到一定程度&#xff0c;就考虑通过加盟的方式扩大市场份额。 本篇文章&#xff0c;将从3个角度来为大家分享&#xff0c;运营加盟模式的好方法和技巧&#xff01; 一、加盟前的准备 1、明确品牌定位与核心竞争力 确定你的企业在市场…

暖水毯/取暖毯语音识别控制芯片IC方案

暖水毯、取暖毯作为现代家居生活的温暖伴侣&#xff0c;其智能化升级已是大势所趋。在暖水毯与取暖毯中融入语音识别控制芯片IC方案&#xff0c;为用户的冬日取暖体验带来了革命性的变革。 一、暖水毯/取暖毯增加语音识别控制芯片方案&#xff0c;让产品能通过对话来调节&…

【笔记】vue课堂小作业之书籍购物车列表的增删改查小记

&#xff08;一&#xff09;reduce作迭代器 1. reduce 函数的基本用法 array.reduce((accumulator, currentValue) > { ... }, initialValue); accumulator: 累积器&#xff0c;表示当前累积的值&#xff0c;通常在第一次时为 initialValue。&#xff08;总数sum&#x…

OpenCV高级图形用户界面(8)在指定的窗口中显示一幅图像函数imshow()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在指定的窗口中显示一幅图像。 函数 imshow 在指定的窗口中显示一幅图像。如果窗口是以 cv::WINDOW_AUTOSIZE 标志创建的&#xff0c;图像将以原…

遵循国药准字,确保益安宁丸疗效与安全

益安宁丸真品辨别唯一标准 益安宁丸为同溢堂药业有限公司所独家生产的一款中成药&#xff0c;在内地市场和港澳地区均有上市。 益安宁丸真品的唯一标准&#xff1a;无论港版还是内地版&#xff0c;包装盒必然有国药准字Z20063087标识&#xff0c;但凡没有国药准字标识的必为假…

性价比最高的开放式耳机,五大热门品牌开放式耳机

在当今快节奏的生活环境中&#xff0c;开放式耳机以其独特的开放式设计&#xff0c;既能让用户享受高质量的音乐&#xff0c;又能保持对外界环境的感知&#xff0c;逐渐成为市场上的新宠。然而&#xff0c;面对众多品牌和型号&#xff0c;如何选择一款性价比高的开放式耳机成为…

IDEA 编译报错 “java: 常量字符串过长” 的解决办法

目录 一、问题描述二、问题原因2.1 理论角度2.2 源码角度 三、解决方案解决方案①&#xff1a;StringBuilder 拼接解决方案②&#xff1a;读取文件内容 四、方案验证 在线文本换行工具&#xff1a; https://lzltool.cn/Toolkit/WrapWordsInText 一、问题描述 今天在开发过程中…

JavaScript全面指南(五)

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;JavaScript篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来JavaScript篇专栏内容:JavaScript全面指南 目录 81、ES6 class关键字原理跟function什么区别 82、如何检…

Vue(3) 组件

文章目录 对组件的理解单文件组件非单文件组件基本使用几个注意点组件的嵌套VueComponent构造函数一个重要的内置关系 组件的自定义事件全局事件总线安装全局事件总线使用事件总线解绑事件消息订阅与发布简介使用步骤范例 $nextTick插槽1.默认插槽2.具名插槽作用域插槽 对组件的…

某市驾驶培训监管服务平台 GreatSQL 数据库适配之旅

某市驾驶培训监管服务平台 GreatSQL 数据库适配之旅 一、项目背景 某市驾培系统主要为社会公众提供驾培单位查询和学车报名&#xff0c;为相关合作单位提供某市驾培监管、某市驾培考核等功能。业务信息教练车培训过程视频信息、包括培训机构基本信息、教练员基本信息和学员个…

从零创建苹果App应用,不知道怎么申请证书的可以先去看我的上一篇文章

用大家自己的开发者账户&#xff0c;登录进入App Store Connect ,注册自己的应用 进入之后&#xff0c;点击增加 填写相关的信息 一切顺利的话&#xff0c;就可以来到这个页面

【Java】画心形图形

开始看到的是这个爱心图形&#xff0c;挺好看的&#xff08;感谢这些前端巨佬&#xff09;&#xff1a; HTML流光爱心_爱心代码html-CSDN博客 本来想着自己看下这个源代码能不能实现&#xff0c;看了下源代码其实非常复杂。 在看代码的过程中发现&#xff0c;源代码里边给出…