标签,这就相当于路由的出口了。
App.vue
```html
```
比如我们现在这个页面,想要访问到,其实只要在地址栏输入下面的地址就可以了
```url
http://localhost:3000/demo1
```

但是如果你使用原来的http://localhost:3000就又访问,会显示404,这时候你可以新建一个 index.vue 页面。这时候在访问http://localhost:3000就可以访问到页面了。

```html
Index Page
```

## NuxtLink标签的使用
index.vue
```html
Index Page
去demo1页面
```

# 04. Nuxt3动态路由的使用
单参数的传递只要在页面的文件名中用[ ]扩起来就可以了。比如新建一个页面,叫做 demo2-[id].vue
```js
-| pages/
---| index.vue
---| demo2-[id].vue
```
demo2-[id].vue
```html
获取的id:{{ $route.params.id }}
```
我们去首页制作一个链接。
```html
Index Page
去demo1页面
去demo2页面
```


## 在script里获取参数
通过useRoute( ) 获得了 route 然后通过ref让template可用,就是vue3语法
```html
获取的id:{{ id }}
```
## 多参数的获取
更改目录结构
```js
-| pages/
---| index.vue
---| goods-[name]/
-----| demo3-[id].vue
```
去首页制作一个链接。
```html
Index Page
去demo1页面
去demo2页面
去demo3页面
```

# 05.Nuxt3 嵌套路由的使用
嵌套路由就是路由是两级,但是程序员的页面是一个。也就是说有父级页面,也有子集页面。类似我们的页面嵌套。
如何建立一个嵌套路由
嵌套路由的建立非常容易,用一句话解释为:目录和文件名同名,就制作了一个嵌套路由。
制作一个嵌套路由页面一般需要三步:
+ 建立嵌套路由的文件夹(约定大于配置)
+ 创建和文件夹相同名称的文件(父页面)
+ 在新建文件夹下任意创建子页面
```html
|--pages
|----parent/
|-------child.vue
|----parent.vue
```
先在\pages目录下,新建一个文件夹 parent ,然后在pages目录下再建立一个parent.vue的文件。文件建立好之后,编写代码。
```html
Parent Page
```
这里的就是嵌套路由的出口,所以如果是嵌套路由,就必须要加上这个标签。这是Nuxt的一个内置组件。 有了父页面之后,在新建的parent文件夹下,再建立一个 child.vue子页面。然后编写代码。
```html
Child Page
```
直接到index.uve增加路由链接。
```html
/parent/child
```
# 06. Nuxt3布局模板
布局模板的作用就是你先定义好一个布局页面,然后提取一些通用的UI或代码到可重用的模板中,提高代码复用性,从而降低代码的复杂度,让代码重用性提高
## 创建布局模板和使用模板
比如现在新建一个文件夹\layouts然后再里边写编写一个 default.vue文件,代码如下。
```html
我是布局模板,default.vue
```
app.vue
```html
```
## 增加多个插槽
修改default.vue布局模板,增加第二个插槽,一个叫做one,一个叫做two。
```html
我是布局模板,default.vue
```
这样编写,一个模板中就有了两个插槽,你可以在页面中通过的形式来指定对应的模板插槽。 在index.vue中使用多个 配合模板实现多插槽。
```html
Index Page
Demo1.vue
Demo2.vue
/parent/child
/parent/two
我是two中的内容
```

# 07.Nuxt3中的数据请求
Nuxt3中提供了四种方法:useAsyncData 、useFetch 、useLazyFetch 、useLazyAsyncData 。提供的四个方法
## useAsyncData的使用
这个方法的一个特点是,它可以进行很多选项的配置,但是在真实开发中,其实我们用的不多。最常用的就是lazy 选项,比如我们设置成true 就是需要数据都返回后,才会显示出来 ,简单说就是会阻塞页面。默认是false。 比如要设置lazy为true,就可以这样写。因为我们的数据太少,所以基本看不出来效果。
详细配置https://v3.nuxtjs.org/api/composables/use-async-data
```js
const res = await useAsyncData("getList", () =>
$fetch("http://121.36.81.61:8000/getTenArticleList")
);
console.log(res);
const res = await useAsyncData(
"getList",
() => $fetch("http://121.36.81.61:8000/getTenArticleList"),
{
lazy: true,
}
);
```
## useFetch的使用
useFetch 可以理解为所有的都选择默认配置的useAsyncData 方法。比如还是上面的请求,我们就可以写成下面的形式。
```js
const res = await useFetch("http://121.36.81.61:8000/getTenArticleList");
const res = await useFetch("http://121.36.81.61:8000/getTenArticleList", {
method: "get",
id: 1,
});
```
## vite跨域配置
nuxt.config.ts
```js
// https://nuxt.com/docs/api/configuration/nuxt-config
export default defineNuxtConfig({
// vite配置
vite: {
server: {
// proxy: {
// '/api': {
// target: 'http://localhost:9999', //这里是接口地址
// changeOrigin: true
// }
// }
}
}
})
```
# 08.Nuxt3 middleware路由中间件
Nuxt3提供了路由中间件的概念,你可以在整个应用使用它,目的是在导航到某一个页面之前,执行一些代码。最常见的路由守卫就可以用这个实现。
## 中间件的基本格式
新建一个middleware的文件夹,然后在文件下边新建一个文件default.global.ts 的文件
```js
export default defineNuxtRouteMiddleware((to, from) => {
console.log("要去那个页面:"+to.path)
console.log(to)
console.log("来自那个页面:"+from.path)
console.log(from)
})
```
## 通过中间件 设置路由守卫
比如我们要访问的页面是`http://localhost:3000/demo1`,现在设置路由守卫,不允许访问,而是跳回到首页。那代码就可以写成下面的样子。
```js
export default defineNuxtRouteMiddleware((to, from) => {
if (to.path === '/demo1') {
console.log('禁止访问这个页面')
abortNavigation() //停止当前导航,可以使用error进行报错
return navigateTo('/')
}
})
```
## 只对一个页面起作用,类似独享守卫
上面都是对所有路由起作用的,如果只想中间件对一个特殊页面起作用,也是可以的。只要去掉.global的后缀就是可以的。 在middleware 文件夹下,新建一个页面,default.ts,并编写下面的代码。
```js
export default defineNuxtRouteMiddleware((to, from) => {
console.log("Hello---独享守卫")
})
```
demoSelf.vue
```html
demoSelf Page
```
# CSR+SSR
## nuxt.config.ts
Nuxt3是支持多种渲染模式,比如:
客户端渲染模式(CSR): 只需将 ssr 设置为 false
服务器端渲染模式(SSR):只需将 ssr 设置为 true
混合渲染模式(SSR | CSR | SSG | SWR):需在 routeRules 根据每个路由动态配置渲染模式(beta版本)
```js
// https://nuxt.com/docs/api/configuration/nuxt-config
export default defineNuxtConfig({
// ssr: false, // ssr为true就是服务端渲染,false就是客户端渲染
// 混合渲染(不同路由设置不同渲染模式)
routeRules: {
"/": { ssr: true }, // ssr
"/demo1": { ssr: false }, // spa 应用
// 3.0.0-12rc -> NetLify
"/demo2": { static: true }, // 只会在构建时生成一次静态页面
"/parent": { swr: true }, // 只会生成多次静态页面( 会自动重新验证页面时候需要重新生成 )
}
})
```