Views
Nuxt提供了几个组件层来实现应用程序的用户界面 默认情况下,Nuxt 会将app.vue文件视为入口点并为应用程序的每个路由呈现其内容
应用程序.vue
<template> <div> <h1>Welcome to the homepage</h1> </div> </template>
Page
在nuxt中,页面代表每个特定路由模式的视图。目录中的每个文件pages/
代表显示其内容的不同路径。 使用页面,创建pages/index.vue
文件并将<NuxtPage />
组件添加到app.vue
(或删除app.vue
默认条目)。
``pages/index.vue <template> <section> <p>这个页面将显示在根路径上,这是page/index页面</p> </section> </template> ``
``pages/about.vue <template> <section> <p>这个页面是page/about页面</p> </section> </template> ``
下面我们将通过app.vue来控制进行跳转页面,其中关于, 见下例示代码注释,后续学习nuxt路由将进行更详细介绍。
//app.vue
<template>
<div>
<!-- 跳转到某个页面 -->
<div class="page mt-24">
<!--通过传递 `to` 来指定链接 --> <!--`<NuxtLink>` 将呈现一个带有正确 `href` 属性的 `<a>` 标签。相当于vue中<router-link to="/">-->
<NuxtLink to="/">index page</NuxtLink>
<NuxtLink to="/about">about page</NuxtLink>
</div>
<div class="current-page">
<div>
当前页面:{{ route.name }}
</div>
<div>
<!-- 路由出口 --> <!-- 路由匹配到的组件将渲染在这里,相当于vue中的<router-view></router-view> -->
<NuxtPage />
</div>
</div>
<!-- 当前路由视图,默认pages下index.vue -->
</div>
</template>
<script setup lang="ts">
const route = useRoute()
</script>
此时运行代码,我们将可以切换路由展示视图。
Components
大多数组件都是用户界面的可重用部分,例如按钮和菜单。在 Nuxt 中,您可以在目录中创建这些组件components/
,它们将在您的应用程序中自动可用,而无需显式导入它们。
``components/title.vue
<template>
<div>
<h1>我是components/title 页面</h1>
</div>
</template>
``
此时修改app.vue任意位置添加上< Title />运行,我们将看到components/title.vue将在页面中展示
Layouts
布局是页面的包装器,包含多个页面的通用用户界面,例如页眉和页脚显示。<slot />
布局是使用组件显示页面内容的Vue 文件。layouts/default.vue
默认情况下将使用该文件。自定义布局可以设置为页面元数据的一部分。我们通过写一个简单的layout布局能很好的理解这一部分内容:
-| layouts/
---| default.vue
---| custom.vue
---| layout.vue
``layouts/layout.vue layout布局
<template>
<div>
<!-- <Button></Button> -->
默认layout布局
<div>
<LayoutHeader />
<slot /><!-- 布局文件中,布局的内容会加载到 中`<slot />`,而不是使用特殊的组件 -->
<LayoutFooter />
</div>
</div>
</template>
``
``components/layoutFooter.vue 页面底部
<template>
<div class="footer">
-------------------------------------- footer --------------------------------------
</div>
</template>
``
``components/layoutHeader.vue 页面头部
<template>
<div class="footer">
-------------------------------------- footer --------------------------------------
</div>
</template>
``
启用默认布局
接下来通过修改app.vue来使用default布局,同样nuxt支持修改页面布局方式
``app.vue
<template>
<div>
<!-- 跳转到某个页面 -->
<div class="page mt-24">
<!--通过传递 `to` 来指定链接 --> <!--`<NuxtLink>` 将呈现一个带有正确 `href` 属性的 `<a>` 标签。相当于vue中<router-link to="/">-->
<NuxtLink to="/">index page</NuxtLink>
<NuxtLink to="/about">about page</NuxtLink>
</div>
<Title></Title> <!--使用components/title.vue组件-->
<!--默认布局,通过:name=“”可以修改布局方式 -->
<NuxtLayout>
<div class="current-page">
<div>
当前页面:{{ route.name }}
</div>
<div>
<NuxtPage /><!-- 当前路由视图,默认pages下index.vue -->
</div>
</div>
</NuxtLayout>
</div>
</template>
<script setup lang="ts">
const route = useRoute()
</script>
``
设置另一个布局
可以像这样直接覆盖默认布局:
··app.vue
<template>
<NuxtLayout :name="layout">
<NuxtPage />
</NuxtLayout>
</template>
<script setup>
const layout = "custom";
</script>
或者,您可以像这样覆盖每页的默认布局:
``layouts/custom.vue
<template>
<div>
Some *custom* layout
<slot />
</div>
</template>
``layouts/layout.vue
<template>
<div>
Some *layout* layout
<slot />
</div>
</template>
动态改变布局可以为布局使用 ref 或计算属性。
<template>
<div>
<button @click="enableCustomLayout">Update layout</button>
</div>
</template>
<script setup>
function enableCustomLayout () {
setPageLayout('custom')
}
definePageMeta({
layout: false,
});
</script>
在每页基础上覆盖布局
如果您正在使用~/pages
集成,则可以通过设置layout: false
然后使用<NuxtLayout>
页面内的组件来完全控制。页面/index.vue布局/custom.vue
``layouts/custom.vue
<template>
<div>
<header>
<slot name="header">
Default header content
</slot>
</header>
<main>
<slot />
</main>
</div>
</template>
Nuxt自定义配置使用的目录结构
除非需要,否则最好坚持使用默认值,nuxt会自动根据设置的命名生成目录结构
``nuxt.config.ts
export default defineNuxtConfig({
dir: {
//自定义Nuxt使用的目录结构,除非需要,否则最好坚持使用默认值。
assets: "assets", //静态资源目录 默认: "assets"
layouts: "layouts", //布局目录,其中的每个文件都会自动注册为 Nuxt 布局。 默认: "layouts"
middleware: "middleware", //中间件目录,其中的每个文件都会自动注册为Nuxt中间件。默认: "middleware"
pages: "pages", //将被处理以自动生成应用程序页面路由的目录。 默认: "pages"
plugins: "plugins", // plugins 目录,其中的每个文件都会自动注册为 Nuxt 插件。默认: "plugins"
public: "public", //dist包含静态文件的目录,可通过 Nuxt 服务器直接访问这些文件,并在生成应用程序时将其复制到文件夹中。 默认: "public"
static: "static", //默认: "public"
},
})