本章节的内容阐述了如何在 Nuxt.js 应用中为指定的路由配置数据和视图,包括应用模板、页面、布局和HTML头部等内容。

模板

你可以定制化 Nuxt.js 默认的应用模板。

定制化默认的 html 模板,只需要在应用根目录下创建一个 app.html 的文件。

默认模板为:

  1. <!DOCTYPE html>
  2. <html {{ HTML_ATTRS }}>
  3. <head>
  4. {{ HEAD }}
  5. </head>
  6. <body {{ BODY_ATTRS }}>
  7. {{ APP }}
  8. </body>
  9. </html>

举个例子,你可以修改模板添加 IE 的条件表达式:

  1. <!DOCTYPE html>
  2. <!--[if IE 9]><html lang="en-US" class="lt-ie9 ie9" {{ HTML_ATTRS }}><![endif]-->
  3. <!--[if (gt IE 9)|!(IE)]><!--><html {{ HTML_ATTRS }}><!--<![endif]-->
  4. <head>
  5. {{ HEAD }}
  6. </head>
  7. <body {{ BODY_ATTRS }}>
  8. {{ APP }}
  9. </body>
  10. </html>

布局

Nuxt.js 允许你扩展默认的布局,或在 layout 目录下创建自定义的布局。

默认布局

可通过添加 layouts/default.vue 文件来扩展应用的默认布局。

别忘了在布局文件中添加 <nuxt/> 组件用于显示页面的主体内容。

默认布局的源码如下:

  1. <template>
  2. <nuxt/>
  3. </template>

错误页面

你可以通过编辑 layouts/error.vue 文件来定制化错误页面.

这个布局文件不需要包含 <nuxt/> 标签。你可以把这个布局文件当成是显示应用错误(404,500等)的组件。

默认的错误页面源码在 这里.

举一个个性化错误页面的例子 layouts/error.vue:

  1. <template>
  2. <div class="container">
  3. <h1 v-if="error.statusCode === 404">页面不存在</h1>
  4. <h1 v-else>应用发生错误异常</h1>
  5. <nuxt-link to="/">首 页</nuxt-link>
  6. </div>
  7. </template>
  8. <script>
  9. export default {
  10. props: ['error'],
  11. layout: 'blog' // 你可以为错误页面指定自定义的布局
  12. }
  13. </script>

个性化布局

layouts 目录下的所有文件都属于个性化布局文件,可以在页面组件中利用 layout 属性来引用。

请确保在布局文件里面增加 <nuxt/> 组件用于显示页面非布局内容。

举个例子 layouts/blog.vue:

  1. <template>
  2. <div>
  3. <div>这里是博客导航</div>
  4. <nuxt/>
  5. </div>
  6. </template>

pages/posts.vue 里, 可以指定页面组件使用 blog 布局。

  1. <script>
  2. export default {
  3. layout: 'blog'
  4. }
  5. </script>

更多关于页面布局配置项的信息,请参考页面布局配置API

看下 示例视频 立刻体验下。

页面

页面组件实际上是 Vue 组件,只不过 Nuxt.js 为这些组件添加了一些特殊的配置项(对应 Nuxt.js 提供的功能特性)以便你能快速开发通用应用。

  1. <template>
  2. <h1 class="red">Hello {{ name }}!</h1>
  3. </template>
  4. <script>
  5. export default {
  6. asyncData (context) {
  7. // called every time before loading the component
  8. return { name: 'World' }
  9. },
  10. fetch () {
  11. // The fetch method is used to fill the store before rendering the page
  12. },
  13. head () {
  14. // Set Meta Tags for this Page
  15. },
  16. // and more functionality to discover
  17. ...
  18. }
  19. </script>
  20. <style>
  21. .red {
  22. color: red;
  23. }
  24. </style>

Nuxt.js 为页面提供的特殊配置项:

属性名 描述
asyncData 最重要的一个键, 支持 异步数据处理,另外该方法的第一个参数为当前页面组件的 上下文对象
fetch asyncData 方法类似,用于在渲染页面之前获取数据填充应用的状态树(store)。不同的是 fetch 方法不会设置组件的数据。详情请参考 关于fetch方法的文档
head 配置当前页面的 Meta 标签, 详情参考 页面头部配置API
layout 指定当前页面使用的布局(layouts 根目录下的布局文件)。详情请参考 关于 布局 的文档
transition 指定页面切换的过渡动效, 详情请参考 页面过渡动效
scrollToTop 布尔值,默认: false。 用于判定渲染页面前是否需要将当前页面滚动至顶部。这个配置用于 嵌套路由的应用场景。
validate 校验方法用于校验 动态路由的参数。
middleware 指定页面的中间件,中间件会在页面渲染之前被调用, 请参考 路由中间件

关于页面配置项的详细信息,请参考 页面 API

HTML 头部

Nuxt.js 使用了 vue-meta 更新应用的 头部标签(Head) and html 属性

Nuxt.js 使用以下参数配置 vue-meta:

  1. {
  2. keyName: 'head', // 设置 meta 信息的组件对象的字段,vue-meta 会根据这 key 值获取 meta 信息
  3. attribute: 'n-head', // vue-meta 在监听标签时所添加的属性名
  4. ssrAttribute: 'n-head-ssr', // 让 vue-meta 获知 meta 信息已完成服务端渲染的属性名
  5. tagIDKeyName: 'hid' // 让 vue-meta 用来决定是否覆盖还是追加 tag 的属性名
  6. }

默认 Meta 标签

Nuxt.js 允许你在 nuxt.config.js 里定义应用所需的所有默认 meta 标签,在 head 字段里配置就可以了:

一个使用自定义 viewport谷歌字体 的配置示例:

  1. head: {
  2. meta: [
  3. { charset: 'utf-8' },
  4. { name: 'viewport', content: 'width=device-width, initial-scale=1' }
  5. ],
  6. link: [
  7. { rel: 'stylesheet', href: 'https://fonts.googleapis.com/css?family=Roboto' }
  8. ]
  9. }

想了解 head 变量的所有可选项的话,请查阅 vue-meta 使用文档

关于 Nuxt.js 应用 HTML 头部配置的更多信息,请参考 HTML 头部配置 API

个性化特定页面的 Meta 标签

关于个性化特定页面的 Meta 标签,请参考 页面头部配置API

注意:为了避免子组件中的meta标签不能正确覆盖父组件中相同的标签而产生重复的现象,建议利用 hid 键为meta标签配一个唯一的标识编号。请阅读关于 vue-meta 的更多信息