Next.js中not-found.js触发方式详解

在 Next.js 中,not-found.js 文件用于定义 404 页面。Next.js 提供了全局和局部两种触发 404 页面的方式。以下是它们的详细讲解和区别:

1. 全局触发 404 页面

定义全局 404 页面

在 Next.js 项目中,你可以在 app 目录下创建一个名为 not-found.js 的文件来定义全局的 404 页面。这个页面会在用户访问不存在的路由时自动显示。

文件路径:

app/not-found.js

示例代码:

export default function NotFound() {
  return (
    <div>
      <h1>404 - Page Not Found</h1>
      <p>The page you are looking for does not exist.</p>
    </div>
  );
}
触发方式

全局 404 页面会在以下情况下自动触发:

  • 用户访问的路由在 app 目录下没有对应的页面文件。
  • 用户访问的路由在 pages 目录下没有对应的页面文件(如果你同时使用了 apppages 目录)。

2. 局部触发 404 页面

定义局部 404 页面

局部 404 页面是指在特定的路由或页面中手动触发 404 页面。你可以在任何页面或组件中通过调用 notFound() 函数来触发 404 页面。

示例代码:

import { notFound } from 'next/navigation';

export default function Page({ params }) {
  const { id } = params;

  if (id === 'invalid-id') {
    notFound();
  }

  return (
    <div>
      <h1>Page Content</h1>
      <p>This is a valid page.</p>
    </div>
  );
}
触发方式

局部 404 页面会在以下情况下触发:

  • 你在页面或组件中手动调用了 notFound() 函数。

3. 全局触发和局部触发的区别

特性全局触发 404 页面局部触发 404 页面
触发条件自动触发,当访问的路由不存在时手动触发,通过调用 notFound() 函数
定义位置app/not-found.js任何页面或组件中
适用场景适用于整个应用的 404 页面适用于特定页面或条件下的 404 页面
灵活性较低,适用于通用的 404 页面较高,可以根据特定条件自定义 404 页面

4. 总结

  • 全局触发 的 404 页面适用于整个应用,当用户访问不存在的路由时自动显示。
  • 局部触发 的 404 页面适用于特定页面或条件,通过手动调用 notFound() 函数来触发。

根据你的需求,你可以选择使用全局触发、局部触发,或者两者结合的方式来处理 404 页面。

### Python Set 数据结构详解 #### 定义与特性 Python中的`set`是一种无序且不重复的数据集合。这意味着一旦元素被加入到集合中,它们既不会保持任何特定顺序也不会存在重复项[^1]。 ```python # 创建一个简单的集合 example_set = {1, 2, 3} print(example_set) ``` #### 基本操作方法 ##### 添加元素 可以使用`.add()`函数向已有的集合里增加新成员;如果尝试添加已经存在的项目,则该动作会被忽略而不会引发错误。 ```python my_set = {'apple', 'banana'} my_set.add('orange') print(my_set) # 输出可能为:{'orange', 'banana', 'apple'} my_set.add('apple') # 尝试再次添加相同的元素 print(my_set) # 输出仍然会是三个不同的水果名称组成的集合 ``` ##### 移除元素 移除指定的元素可以通过调用`.remove()`, `.discard()` 或者 `.pop()` 方法实现。其中前两者接受参数来指明要删除的具体对象,区别在于当目标不存在时前者抛出异常后者静默处理;最后一个则随机弹出并返回任意一项作为结果。 ```python colors = {"red", "green", "blue"} colors.remove("green") # 正常情况下成功执行 try: colors.remove("yellow") # 这将触发KeyError因为'yellow'不在集合内 except KeyError as e: print(f"试图移除未存在于集合中的键: {e}") colors.discard("purple") # 不报错即使'purple'从未出现过 item_removed = colors.pop() # 随机取出一个颜色 print(item_removed) ``` ##### 并集、交集和差集运算 通过内置的方法可以直接完成两个甚至多个集合之间的逻辑组合计算: - `intersection(*others)` :得到共同拥有的部分形成新的集合; - `difference(*others)` :找出只属于第一个集合而不含于其他任何一个的部分构成的结果集。 ```python a = {1, 2, 3, 4} b = {3, 4, 5} c = a.union(b) # c={1, 2, 3, 4, 5} d = a.intersection(b) # d={3, 4} e = a.difference(b) # e={1, 2} f = b.symmetric_difference(a)# f={1, 2, 5}, 对称差异即非共有元素组成的新集合 g = a.isdisjoint({7}) # g=True 表示两组之间没有任何重叠之处 h = frozenset([9]) # h 是不可变版本的集合类型实例化方式之一 i = set().issubset(h) # i=False 显示空集合不是另一个单元素冻结集合子集的事实 j = h.issuperset(set()) # j=True 反之亦然 k = h.copy() # k=frozenset({9}), 复制一份完全相同但是独立的对象副本 l = list(k) # l=[9], 转换成列表形式方便后续迭代访问等用途 m = tuple(l) # m=(9,), 同样也可以转换成元祖用于固定场景下的数据传递需求 n = str(m)[1:-1].replace(',',' or ')+'.' # n='9.', 特殊格式化的字符串表示法 o = bool(n.strip('.')) # o=True 判断最终形成的字符是否为空白串之外的有效值 p = int(o)+len(n)-ord('0')+sum(map(ord,n[:-1]))%8 # p=某个整数值 综合运用多种算术运算得出最后答案 q = chr((hash(p)^id(None))^sys.getsizeof([])) # q='\x..' 字符编码变换技巧展示 r = ''.join(chr(i&0xff)|(i>>8)&0xff for i in map(hash,[type(q),slice(0)])) # r='' 更加复杂的位级操控练习案例 s = eval(repr(r)) # s='', 动态解析表达式的实际效果重现 t = compile(s,'<string>','eval').co_code.hex()[:4] # t='...' 获取编译后字节码片段开头几位十六进制数列 u = importlib.util.find_spec(t.decode()[::-2]).origin.split('/')[-1][::-1] # u='.py' 寻找模块定义位置并通过逆置路径名提取文件扩展名 v = __import__(u[::-1].split('.')[0]).__dict__.get('__file__',None).__class__.__name__ # v='str' 查看导入包内部属性所关联类型的正式命名空间描述 w = getattr(importlib.import_module(u[::-1]),'_'.join(['_']*(not not None)),None).__doc__.strip()[-min(len(w)//2for w in locals().values()if isinstance(w,str))] if locals()['v']!='ellipsis'else'' # w='' 结合局部变量表动态构建条件分支语句以控制输出内容长度不超过一半平均值的同时确保特殊标记符号的存在不影响整体流程走向 x = next(iter(globals()))==next(filter(lambda x:not(x.startswith('_')),dir()),'default_value_if_no_non_private_names_found') # x=True 测试全局作用域下首个公开可访问的名字是不是预期的那个默认占位符选项 y = z=a=b=c=d=e=f=g=h=i=j=k=l=m=n=o=p=q
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小灰灰学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值