Nuxt项目中的页面是在 pages目录 下创建的
方式一:手动创建(文件与文件夹方式均可以)
方式二:命令行创建
npx nuxi add page home # 创建home页面(单文件)
npx nuxi add page detail/[id] # 创建detail页面(文件夹)
npx nuxi add page user-[role]/[id] # 创建user页面
Nuxt3 框架也提供一些内置的组件,常用的如下:
Nuxt使用两个目录来处理像stylesheets, fonts 或 images这样的资产。
public
<template>
<img src='/img/nuxt.png'/>
</template>
assets
<template>
<img src='~/assets/img/nuxt.png'/>
</template>
<style scoped lang="scss">
/* 1.手动导入全局样式 */
/* @import "~/assets/styles/variables.scss"; */
// as vb: 给这个模块起一个命名空间
// as * : 可以省略命名空间
// @use 和 @import
/* @use "~/assets/styles/variables.scss" as bv; */
/* @use "~/assets/styles/variables.scss" as *; */
.local-style {
/* color: vb.$fsColor; */
color: $fsColor;
font-size: $fs20;
@include border();
}
</style>
css:您可以定义要全局设置的CSS文件/模块/库(包含在每个页面中)。
Nuxt将根据其扩展名自动猜测文件类型,并使用适当的预处理器。如果需要使用它们,您仍然需要安装所需的加载器。
vite: 要在Nuxt组件样式中全局插入语句,可以使用nuxt.config 文件中的Vite选项。
export default defineNuxtConfig({
css: [
"@/assets/styles/main.css",
"@/assets/styles/global.scss",
"@/assets/cus-font/iconfont.css", // 自定字体图标
],
vite: {
css: {
preprocessorOptions: {
scss: {
// 自动的给 scss 模块首行添加额外的数据:@use "@/assets/styles/variables.scss" as *;
additionalData: '@use "@/assets/styles/variables.scss" as *;',
},
},
},
},
});
// assets/cus-font/iconfont.css
@font-face {
font-family: "iconfont"; /* Project id */
src: url("~/assets/cus-font/iconfont.ttf") format("truetype");
}
export default defineNuxtConfig({
css: [
"@/assets/cus-font/iconfont.css", // 自定字体图标
],
});
<NuxtLink to="/">index</NuxtLink>
<NuxtLink to="/home">home</NuxtLink>
navigateTo 函数在服务器端和客户端都可用,也可以在插件、中间件中使用,也可以直接调用以执行页面导航,例如:
navigateTo( to , options) 函数:
function goToCategory() {
return navigateTo("/category");
}
function gotoCategory2() {
return navigateTo(
{
path: "/category",
query: {
id: 200,
},
},
{
replace: true, // 是否是替换当前的页面
}
);
}
function gotoCategory2() {
return navigateTo("https://www.jd.com", {
external: true,
});
}
Nuxt3z中的编程导航除了可以通过 navigateTo 来实现导航,同时也支持 useRouter ( 或 Options API 的 this.$router )
useRouter常用的API
// useRouter
let router = useRouter();
function goToCart() {
router.push("/cart"); // navigateTo
}
function goBack() {
router.go(-1);
}
// 路由的守卫
router.beforeEach((to, form) => {
console.log(to);
console.log(form);
});
Nuxt3 和 Vue一样,也是支持动态路由的,只不过在Nuxt3中,动态路由也是根据目录结构和文件的名称自动生成
动态路由语法:
例如
动态路由 和 index.vue 能同时存在, Next.js也可以
如果有类型报错 删除.nuxt文件
npm run postinstall
动态路由参数
查询字符串参数
<script lang="ts" setup>
// 拿到动态路由的参数
const route = useRoute();
const { id } = route.params;
const { name } = route.query;
</script>
捕获所有不配路由(即 404 not found 页面)
预定义路由优先于动态路由,动态路由优先于捕获所有路由。请看以下示例:
Nuxt 和 Vue一样,也是支持嵌套路由的,只不过在Nuxt中,嵌套路由也是根据目录结构和文件的名称自动生成。
编写嵌套路由步骤:
Nuxt 提供了一个可定制的 路由中间件,用来监听路由的导航,包括:局部和全局监听(支持再服务器和客户端执行)
路由中间件分为三种:
路由中间件可参考vue路由守卫
业务页面
<script lang="ts" setup>
definePageMeta({
// 路由中间件( 监听路由 )
middleware: [
// 第一个中间件(匿名,此页面独享)
function (to, from) {
console.log("index 第一个中间件");
// 如果返回的是 "" null, 或 没有返回语句,name就会执行下一个中间件
// 如果返回的是 navigateTo, 直接导航到新的页面
// return navigateTo("/detail02");
},
// 第二个中间件(命名)
"home",
// 作用:抽取到单独文件中,可在多个页面中使用
// 第三个中间件(全局)
'auth'
// 作用:会加到每个路由中,例如用来判断用户是否已登录
],
// server: 刷新浏览器器的会在服务器端执行
// client:在客户端切换路由, 只会在客户端执行
export default defineNuxtRouteMiddleware((to, from) => {
// console.log(from);
// console.log(to);
console.log("home.ts 第二个中间件");
});
auth.global.ts
// 这个优先级别是比较高的,最先执行
export default defineNuxtRouteMiddleware((to, from) => {
const isLogin = false;
console.log("index 第三个中间件 auth.global.ts");
console.log(to);
// if (!isLogin && to.fullPath !== "/login") {
// return navigateTo("/login");
// }
});
Nuxt支持对每个页面路由进行验证,我们可以通过definePageMeta中的validate属性来对路由进行验证。(比如验证你的传参是否规范)
<script lang="ts" setup>
definePageMeta({
// 路由参数的验证
validate: (route) => {
console.log(route.params.id);
// return /^\d+$/.test(route.params.id as string);
// return false // 404 -> 500 401 ...
return {
statusCode: 401, // 路由验证失败
statusMessage: "validata router error",
};
},
});
</script>
在项目根目录(不是pages目录)新建 error.vue
这个页面有一个单一的prop—— error,它包含一个错误供您处理。
当你准备删除错误页面时,你可以调用 clearError助手函数,它接受一个可选的路径来重定向到(例如,如果你想导航到一个’安全’页面)。
error.vue
<template>
<div>
Error Page {{ error }}
<div>
<button @click="goHome">Home</button>
</div>
</div>
</template>
<script lang="ts" setup>
const props = defineProps({
error: Object,
});
function goHome() {
clearError({ redirect: "/" });
}
</script>
<style scoped></style>