Nuxt讲解

news2024/10/10 12:25:36

代码仓库

nuxt基础

内置组件

nuxt为我们提供了一些内置组件,可以直接使用不用导入,其中常用的如下

SEO组件

  • Html
  • Body
  • Head
  • Title
  • Meta
  • Style
  • Link
  • NoScript
  • Base

SEO组件可以更加方便的让我们再页面中添加利于seo的元素

NuxtWelcome

欢迎页面组件,该组件是nuxt/ui的一部分

NuxtPage

该组件时Nxut自带的页面的占位组件,是对router-view的封装,另外nuxt采用的是约定式路由,即不需要我们手动配置路由,nuxt会根据我们在pages文件夹中的文件以及app文件夹(开发中),具体的我们会在下边介绍。

NuxtLink

该组件相当于vue-router中的router-link组件,用于页面跳转
组件属性

  • to: 表示要跳转的路径
  • href: to的别名
  • replace: boolean 默认为false,是否替换当前路由
  • activeClass: 激活连接时的生效的类名
  • target: 和a标签的target一样

ClientOnly

该组件的默认插槽的内容只会再客户端渲染,而fallback插槽的内容只在服务器端渲染
在服务端渲染期间,fallback内容会被渲染,一般会显示加载信息

<template>
  <div>home</div>
  <NuxtLink to="/">home</NuxtLink>
  <div>
    <ClientOnly>
      <!-- 
        在服务端渲染期间,fallback内容会被渲染,一般会显示加载信息
       -->
      <template #fallback>
        <p>该内容只会再服务器端渲染</p>
      </template>
    </ClientOnly>
    <ClientOnly>
      <template #default>
        <p>该内容会再客户端渲染</p>
      </template>
    </ClientOnly>
  </div>
</template>
<script setup lang="ts"></script>

<style scoped></style>

(/pages/home/index.vue)

全局样式

安装sass

yarn add sass -D

新建assets文件夹,并在该文件夹中新建css文件夹,新建global.scss文件用于写一些全局样式,新建value.scss用于保存全局变量
在nuxt.config.ts中配置

// https://nuxt.com/docs/api/configuration/nuxt-config
export default defineNuxtConfig({
  devtools: { enabled: true },
  //全局引入样式
  css: ["@/assets/css/global.scss"],
  vite: {
    css: {
      preprocessorOptions: {
        scss: {
          // 每个文件中都会加上这句话
          additionalData: "@use '@/assets/css/value.scss' as *;",
        },
      },
    },
  },
});

之后我们在/pages/index.vue中使用,就可以看到效果了

静态资源

nuxt中提供两个目录用于存放静态资源,比如:stylesheets、fonts或img

  • public
    • 可以通过**/**来获取到public目录中的文件

例如:

<img
  class="imgSty"
  src="/01.jpg"
  alt=""
  />
  • asstes
    • 可以通过**~/assets/或者@/assets/**路径径引用assets目录中的文件

例如:

<img
src="@/assets/img/01.jpg"
class="imgSty"
alt=""
  />

/pages/index.vue

pages

新建页面

  • nuxt项目的页面一般是在pages目录下创建的,不过我们在新初始化的项目中官方默认给的是app目录,这两个目录使用方法差不多,并且app目录在最新版官方文档中并没有出现,表示正在实验阶段,后续语法可能会改变,所以就不过多赘述
  • nuxt的页面路由也称为文件系统路由,我们不需要额外配置,直接根据/文件名的方式就可以访问,如果是文件夹,文件夹中的index.vue可以通过/文件夹名的方式访问,其他文件通过/文件夹名/文件名的方式访问

nuxt为我们提供了命令的方式去创建页面

# 创建home页面
npx nuxi add page home

NuxtLink

<NuxtLink to="/">home</NuxtLink>

编程式路由导航

nuxt3除了可以通过NuxtLink内置组件进行导航,也支持编程导航:navigateTo、useRouter
不过使用编程导航不利于SEO

navigateTo

基本使用

navigateTo(url,options?);

  • url表示姚导航的连接,可以是字符串也可以是路由对象
    • 路由对象:
      • path:导航的连接
      • query:query参数
  • options导航配置,可选
    • replace:默认是false,是否替换当前页面
    • external:默认是false,是否允许导航到外部连接
// 无参
navigateTo("/about", {
  replace: false,
  external: false,
});

// 有参(可以传递query参数或者params参数)
navigateTo({
  path: "/home",
  query: {
    type: "phone",
  },
});

/pages/index.vue

获取参数
const route = useRoute();
console.log(route.query);
//console.log(route.params);

/pages/home/index.vue

useRouter

常用API
const router=useRouter();
// 页面返回,类似于router.go(-1);
router.back();
// 页面前进,类似于router.go(1)
router.forward();
// 页面前进或者返回(接收一个数字)
router.go(1);
// 以push方式导航到新页面
router.push({path:"/home"});//建议使用navigateTo代替
// 以replace方式导航到新页面
router.replace({path:"/home"});//建议使用navigateTo代替
// 路由全局守卫,每次导航前执行,用于全局监听,接收一个回调函数
router.beforeEach();
// 路由守卫,每次导航后执行,用于全局监听,接收一个回调函数
router.afterEach();
获取参数

获取参数和navigateTo获取参数类似

动态路由

我们可以使用[]方括号的形式来编写动态路由,方括号里边存放是动态路由的参数

基本使用

pages/detail/[id].vue	=> /detail/:id
pages/detail/user-[id].vue => /detail/user-:id
pages/detail/[role]/[id].vue => /detail/:role/:id

获取参数

通过route.params获取传递的参数

const route = useRoute();
const id = route.params.id;

404页面

nuxt为我们提供了404页面,但是并不适用于页面展示,我们可以自己定义404页面,通过方括号内添加三个点即表示捕获所有不匹配路由
例如:[…not].vue(not是一个名字,这个可以自定义)
pages目录中新建[…not].vue

嵌套路由

再文件夹中创建一个与一级路由同名的文件夹就可以使用嵌套二级路由

- pages
---| parent/
  ----| index.vue
---| parent.vue

访问路径/parent/parent

页面布局

我们的网站中经常会遇到每个页面中都包含一样的页头以及页脚
我们就可以使用layout来进行布局
再跟目录新建layouts文件夹
页面布局可以使用两种布局方式一种是默认布局,一种是自定义布局

默认布局

在layouts目录下default.vue
然后再app.vue中通过NuxtLayout包裹

<!-- default.vue -->
<template>
  <div class="layout">
    <div>页头</div>
    <slot></slot>
    <div>页脚</div>
  </div>
</template>
<script setup lang="ts"></script>

<style scoped></style>

<!-- app.vue -->
<template>
  <div>
    <NuxtLayout>
      <!-- 默认欢迎页 -->
      <!-- <NuxtWelcome /> -->
      <!-- 占位组件 -->
      <NuxtPage></NuxtPage>
    </NuxtLayout>
  </div>
</template>

自定义布局

在layouts中新建my-layout.vue,然后通过name属性指定布局类型(命名格式不能使用大驼峰)

<!-- my-layout.vue -->
<template>
  <div>
    <div>我是自定义页头</div>
    <slot></slot>
  </div>
</template>
<script setup lang="ts"></script>

<style scoped></style>

<!-- app.vue -->
<template>
  <div>
    <NuxtLayout name="my-layout">
      <!-- 默认欢迎页 -->
      <!-- <NuxtWelcome /> -->
      <!-- 占位组件 -->
      <NuxtPage></NuxtPage>
    </NuxtLayout>
  </div>
</template>

页面中指定布局方式

我们也可以使用definePageMeta来指定当前页面布局模板,
使用时NuxtLayout不能指定布局方式否则不生效

definePageMeta({
  layout: "my-layout",
});

/pages/about/index.vue

生命周期

image.png

获取数据

我们在之前项目中,我们一般使用axios去请求数据,但是在nuxt中,官方更加推荐我们使用useFetch而不是axios

封装

import type { AsyncData, UseFetchOptions } from "nuxt/dist/app/composables";

const BASE_URL = "";
type Methods = "GET" | "POST";

class MyRequest {
  request<T = any>(
    url: string,
    method: Methods,
    data?: any,
    options?: UseFetchOptions<T>
  ): Promise<AsyncData<T, Error>> {
    return new Promise((resolve, reject) => {
      const newOptions: UseFetchOptions<T> = {
        baseURL: BASE_URL,
        method: method,
        ...options,
      };

      if (method === "GET") {
        newOptions.query = data;
      }
      if (method === "POST") {
        newOptions.body = data;
      }
      useFetch<T>(url, newOptions as any)
        .then((res) => {
          resolve(res as AsyncData<T, Error>);
        })
        .catch((error) => {
          reject(error);
        });
    });
  }

  get<T = any>(url: string, params?: any, options?: UseFetchOptions<T>) {
    return this.request<T>(url, "GET", params, options);
  }

  post<T = any>(url: string, data?: any, options?: UseFetchOptions<T>) {
    return this.request<T>(url, "POST", data, options);
  }
}

export default new HYRequest();

全局状态数据共享

使用pinia去实现全局状态管理
具体使用pinia的方式我会在下一个博客中详细说明

yarn add pinia @pinia/nuxt

配置

在nuxt.config.ts中添加配置

modules: ["@pinia/nuxt"]

使用element plus

安装

yarn add element-plus

自动导入

yarn add unplugin-element-plus -D

babel 转义

yarn add unplugin-element-plus -D

nuxt.config.ts配置

// https://nuxt.com/docs/api/configuration/nuxt-config
import ElementPlus from "unplugin-element-plus/vite";

export default defineNuxtConfig({
  devtools: { enabled: true },
  css: [
    "normalize.css",
    "@/assets/css/global.scss",
    "@/assets/cus-font/iconfont.css",
  ],
  modules: ["@pinia/nuxt"],
  // 配置自动导入样式
  vite: {
    css: {
      preprocessorOptions: {
        scss: {
          additionalData: "@use '@/assets/css/variables.scss' as *;",
        },
      },
    },
    plugins: [ElementPlus({})],
  },
  app: {
    // 可以给所有的页面的head添加一下SEO的信息
    head: {
      title: "",
      meta: [
        {
          name: "description",
          content:
            "",
        },
        {
          name: "keywords",
          content: "",
        },
        { name: "viewport", content: "width=device-width, initial-scale=1" },
      ],
      link: [{ rel: "icon", type: "image/x-icon", href: "/favicon.ico" }],
      noscript: [{ children: "Javascript is required" }],
    },
  },
  build: {
    // 该文件需要进行Babel转义
    transpile: ["element-plus/es"],
  },
});

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

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

相关文章

打开深度学习的锁

打开深度学习的锁 导言一、导入的包和说明二、数据的预处理2.1 数据集说明2.2 数据集降维度并且转置2.3 数据预处理完整代码 三、逻辑回归3.1 线性回归函数公式3.2 sigmoid函数公式 四、初始化函数五、构建逻辑回归的前向传播和后向传播5.1 损失函数5.2 前向传播5.3 后向传播5.…

Excel学习 WPS版

Excel学习 1.界面基础1.1 方格移动快捷键1.2 自动适配文字长度1.3 跨栏置中1.4 多个单元格同宽度&#xff1a;1.5 下拉框选择1.6 打印预览1.7 绘制边框1.8 冻结一行多行表头1.9 分割视图 2.日期相关2.1 今日日期快捷键2.2 月份提取 3.数学公式3.1 自动增长3.2 排序3.3 筛选3.4 …

时间、时间戳互转、日期格式化、获取各种天数

我们在工作中经常遇到日期格式的转换&#xff0c;比如获取当前时间&#xff0c;转换当前时间格式为2023/09/09、2023-09-09、2023-09-09 18:12:01、时间戳、时间戳转日期、日期转时间戳、获取当前季度&#xff0c;获取上一季度、获取下一季度、获取下一周&#xff0c;获取上一周…

Android EditText setTranslationY导致输入法覆盖问题

平台 RK3288 Android 8.1 显示: 1920x1080 160 dpi 概述 碰到一个问题&#xff1a; 弹出的输入法会覆盖文本输入框。 原因&#xff1a;输入框使用了setTranslationY() 位置偏移后&#xff0c; 输入法无法正确获取焦点的位置。 分析 先上图: 初始布局 调用etTranslation…

【GO语言基础】基本数据类型

系列文章目录 【Go语言学习】ide安装与配置 【GO语言基础】前言 【GO语言基础】变量常量 【GO语言基础】数据类型 文章目录 系列文章目录数据类型数值型&#xff1a;整数类型&#xff1a;浮点数类型&#xff1a; 字符型-布尔型-字符串零值转义字符 常用类型转换运算符总结 数据…

matplotlib从起点出发(8)_Tutorial_8_Legend

1 图例教程 在matplotlib中灵活地生成Legend。 本图例指南是legend()中可用文档的扩展——在继续阅读本指南之前&#xff0c;请确保你熟悉legend()文档的内容。 本指南使用了一些常用术语&#xff0c;为清楚起见&#xff0c;此处记录了这些术语&#xff1a; legend entry 图…

【Image captioning】S2 Transformer for Image Captioning 实现流程

S2 Transformer for Image Captioning 实现流程 作者:安静到无声 个人主页 目录 S2 Transformer for Image Captioning 实现流程环境设置数据准备训练评价离线评估在线评估参考文献和引用参考引用致谢推荐专栏环境设置 克隆此存

代码随想录算法训练营第三十二天|122.买卖股票的最佳时机II 55. 跳跃游戏 45.跳跃游戏II

122.买卖股票的最佳时机II 本题解法很巧妙&#xff0c;大家可以看题思考一下&#xff0c;在看题解。 代码随想录 public int maxProfit(int[] prices) {int result 0;for (int i 1; i < prices.length; i) {result Math.max(prices[i] - prices[i - 1], 0);}return re…

【可定制、转换时间戳】解析nc文件,并保存为csv文件

解析nc文件&#xff0c;并保存为csv文件 写在最前面解析nc文件&#xff08;代码汇总放最后面&#xff09;读取nc文件获取气象文件中所有变量解析时间解析部分代码汇总 写入csv文件 写在最前面 愿称之为&#xff1a;支持私人订制、非常完美的版本 参考&#xff1a; 解析部分参…

C 风格文件输入/输出---无格式输入/输出

C 标准库的 C I/O 子集实现 C 风格流输入/输出操作。 <cstdio> 头文件提供通用文件支持并提供有窄和多字节字符输入/输出能力的函数&#xff0c;而 <cwchar>头文件提供有宽字符输入/输出能力的函数。 无格式输入/输出 从文件流获取字符 std::fgetc, std::getc …

TorchDynamo初探②:Torch.FX调研和实践

作者&#xff5c;strint 1 概要 torch.fx 是 PyTorch 官方发布的 Python 到 Python 的代码变换工具。如果你想做 Torch 代码变换&#xff0c;torch.fx 是首选工具。 torch.fx 会将 Torch 代码 trace 成 6 种基础的 node 组成的 graph&#xff0c;基于这个 graph 可以方便的做各…

01 PHP基础知识讲解

一 php基础知识 PHP文件的默认拓展名是“php”。 PHP文件中包含HTML标记、PHP标记、PHP代码以及空格和注释。 PHP标记&#xff1a;开始标记<?php 结束标记 ?> 中间内容是PHP代码。 PHP代码&#xff1a;学习第一个指令 echo 功能是用于输出字符串 。 语句结束符&a…

从零开始-与大语言模型对话学技术-gradio篇(4)

前言 本文介绍「星火杯」认知大模型场景创新赛中的落选项目- AI命理分析系统&#xff0c;属于个人娱乐练手。总结提炼了往期文章精华并发掘出新的知识。 包括本地部署版本和Web在线版本&#xff0c;两种打包方式基于 半自动化使用.bat手动打包迁移python项目 如何把 Gradio …

Minio集群搭建

一、官方文件 1、minio官网 https://min.io/ 2、中文文档 http://docs.minio.org.cn/docs/ 3、集群原理 二、集群部署 1、在每台服务器上创建minio目录 mkdir -p /app/minio/{run,data1,data2} && mkdir -p /etc/minio2、下载或者上传下载好的minio二进制文件 https…

net/http库中request.RemoteAddr的值不确定性-【Golang踩坑笔记】

环境信息&#xff1a; Go 1.20Windows 11 x64 代码示例 // 这里的r是框架传入的request&#xff0c;其中封装了net/http下的request.go中的Request fmt.Println("r.RemoteAddr:", r.RemoteAddr) // 本地执行时,该值可能是[::1]:port也可能是127.0.0.1:port 当在…

安装GPU驱动,CUDA Toolkit和配置与CUDA对应的Pytorch

如果有帮助,记得回来点个赞 目录 1.安装指定GPU驱动如果安装的GPU CUDA Version和CUDA Toolkit版本已经冲突怎么办? 2.安装指定版本的CUDA Toolkit如果我安装了CUDA Toolkit之后nvcc -V仍然显示旧的CUDA Toolkit版本怎么办? 3.安装与CUDA对应的Pytorch 1.安装指定GPU驱动 &…

C++之string

目录 1、了解string 2、string相关函数 3、相关函数的使用 ①构造函数 ②赋值 ③>>&#xff0c;<< ④operator[] ⑤size ⑥iterator(迭代器) ⑦push_back ⑧append ⑨ ⑩capacity ⑪reserve ⑫resize ⑬insert ⑭erase ⑮c_str ⑯find ⑰substr…

简化转换器:使用您理解的单词进行最先进的 NLP — 第 1 部分 — 输入

一、说明 变形金刚是一种深度学习架构&#xff0c;为人工智能的发展做出了杰出贡献。这是人工智能和整个技术领域的一个重要阶段&#xff0c;但也有点复杂。截至今天&#xff0c;变形金刚上有很多很好的资源&#xff0c;那么为什么要再制作一个呢&#xff1f;两个原因&#xff…

代码随想录第43天|416. 分割等和子集,1049. 最后一块石头的重量 II, ​494.目标和,​ 474.一和零(一窍不通)

416. 分割等和子集 思路 本题是01背包的应用题 背包的体积为sum / 2背包要放入的商品&#xff08;集合里的元素&#xff09;重量为 元素的数值&#xff0c;价值也为元素的数值背包如果正好装满&#xff0c;说明找到了总和为 sum / 2 的子集。背包中每一个元素是不可重复放入…

(其他) 剑指 Offer 67. 把字符串转换成整数 ——【Leetcode每日一题】

❓ 剑指 Offer 67. 把字符串转换成整数 难度&#xff1a;中等 写一个函数 StrToInt&#xff0c;实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。 首先&#xff0c;该函数会根据需要丢弃无用的开头空格字符&#xff0c;直到寻找到第一个非空格的字符为…