Nuxt.js的API学习

目录结构

资源目录assets

资源目录assets用于组织未编译的静态资源如LESS、SASS或JavaScript。
在编译vue模版或者css文件时,<img src="">、background: url(...)、@import均会被解析成模块通过require引用。如果我们在css代码中使用url('assets/image.png'),那么编译后它将被转换成require('/assets/image.png')。

vue模版、js、css中分别引入图片

vue模版中引入图片有三种方式

// 相对路径
<img src="../assets/images/write.svg">
// 有斜杠
<img src="~/assets/images/write.svg">
// 没有斜杠
<img src="~assets/images/write.svg">

js中引入图片有两种方式

// 相对路径
this.img = require('../static/images/share.svg')
// 有斜杠
this.img = require('~/static/images/share.svg')

注意:必须要有require并且有斜杠。
css中引入图片有两种方式

// 相对路径
background: url('../assets/images/juejin.svg')
// 没有斜杠 
background: url('~assets/images/juejin.svg')

综上所述:为了统一写法方便记忆在vue模版、require有斜杠或相对路径,css中没有斜杠或相对路径,引入static中图片和assets中图片方式一致。

// vue模版
<img src="~/assets/images/write.svg">
// js
this.img = require('~/static/images/share.svg')
// css
background: url('~assets/images/juejin.svg')

不建议使用相对路径,这样子就不需要再去查找层级。

js中引入组件,css中引入样式

css在引入scss文件的时候老是报错,后来发现没有安装sass插件

组件目录components

组件目录components用于组织应用的vue.js组件。Nuxt.js不会扩展增强该目录下vue.js组件,即这些组件不会像页面组件那样有asyncData方法的特性。

布局目录

布局目录layouts用于组织应用的布局组件。Nuxt.js允许你扩展默认的布局,或在layout目录下创建自定义的布局。

默认布局

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

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

vue-cli中index.html是整个项目页面,app.vue是vue根组件,其中router-view是匹配最外层的路由,在nuxt开发当中nuxt.config.js中有head属性用来控制页面头部相当于index.html,./layout/default.vue用来显示主体相当于app.vue,<nuxt/>相当于app.vue中router-view。

注意:没有keep-alive
由于是服务端渲染,所以不支持组件的keep-alive,那自然activaed、deactivated这两个生命周期也没了

错误页面

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

警告:虽然此文件放在layouts文件夹中,但应该将它看作是一个页面,相当于vue-cli中default文件夹下的组件。

这个布局文件不需要包含<nuxt/>标签。你可以把这个布局文件当成是显示应用错误(400, 500等)的组件。举一个个性化错误页面的例子layouts/error.vue:

<template>
  <div class="container">
    <h1 v-if="error.statusCode === 404">页面不存在</h1>
    <h1 v-else>应用发生错误异常</h1>
    <nuxt-link to="/">首 页</nuxt-link>
  </div>
</template>

<script>
export default {
  props: ['error'],
  layout: 'blog' // 你可以为错误页面指定自定义的布局
}
</script>
自定义布局

layouts目录中的每个文件(顶级)都将创建一个可通过页面组件中的layout属性访问的自定义布局,例如上面的error.vue中的layout。假设我们要创建一个博客布局并将其保存到layouts/blog.vue:

<template>
  <div>
    <div>我的博客导航栏在这里</div>
    <nuxt/>
  </div>
</template>

然后我们必须告诉页面 (即pages/posts.vue) 使用您的自定义布局:

<template>
<!-- Your template -->
</template>
<script>
export default {
  layout: 'blog'
  // page component definitions
}
</script>

自定义布局只能用在layouts文件夹下的vue文件,项目会默认加载layouts/default.vue布局文件,假如我不想用默认布局,想换其他布局那么就可以用layout属性来切换成其他页面布局。

中间件目录

中间件允许您定义一个自定义函数运行在一个页面或一组页面渲染之前。每一个中间件应放置在middleware/目录。文件名的名称将成为中间件名称(middleware/auth.js将成为auth中间件)。一个中间件接收context作为第一个参数:

export default function (context) {
   context.userAgent = process.server ? context.req.headers['user-agent'] : navigator.userAgent
}

中间件可以在nuxt.config.js、layouts或者pages中使用,执行顺序是nuxt.config.js---layouts---pages
中间件执行流程顺序:
1.nuxt.config.js
2.匹配布局
3.匹配页面
中间件可以异步执行,只需要返回一个Promise或使用第2个callback作为第一个参数:middleware/stats.js

import axios from 'axios'
export default function ({ route }) {
  return axios.post('http://my-stats-api.com', {
    url: route.fullPath
  })
}

然后在你的 nuxt.config.js 、 layouts 或者 pages 中使用中间件:
nuxt.config.js

module.exports = {
  router: {
    middleware: 'stats'
  }
}

stats 中间件将在每个路由改变时被调用。
总结:可以在middleware文件夹下定义文件,文件名就是中间件名称,里面是一个自定义函数运行在一个页面或一组页面渲染之前,中间件可以异步执行,只需要返回一个Promise或使用2个callback作为第一个参数,然后在你的nuxt.config.js、layouts或者pages中调用中间件。

页面目录

页面目录pages用于组织应用的路由及视图。Nuxt.js框架读取该目录下所有的.vue文件并自动生成对应的路由配置。页面组件实际上是Vue组件,只不过Nuxt.js为这些组件添加了一些特殊的配置项(对应的Nuxt.js提供的功能特性)以便快速开发通用应用。
Nuxt.js为页面提供的特殊配置项:

asyncData

最重要的一个键,支持异步数据处理,另外该方法的第一个参数为当前页面组件的上下文对象。
Nuxt.js扩展了Vue.js,增加了一个叫asyncData的方法,使得我们可以在设置组件的数据之前能异步获取或处理数据。
asyncData方法会在组件(限于页面组件)每次加载之前被调用。它可以在服务端或路由更新之前被调用。在这个方法被调用。这个方法被调用的时候,第一个参数被设定为当前页面的上下文对象,你可以利用asyncData方法来获取数据,Nuxt.js会将asyncData返回的数据融合组件data方法返回的数据一并返回给当前组件。

注意:由于asyncData方法是在组件初始化前被调用的,所以在方法内是没有办法通过this来引用组件的实例对象。
Nuxt.js提供了几种不同的方法来使用asyncData方法,你可以选择自己熟悉的一种来用:
1.返回一个Promise
2.使用async和await

asyncData方法的第一个参数context是上下文对象,它是各种属性和方法的集合,利用context可以去获取各种数据和调用各种方法。

fetch

与asyncData方法类似,用于在渲染页面之前获取数据填充应用的状态树(store)。不同的是fetch方法不会设置组件的数据。
如果页面组件设置了fetch方法,它会在组件每次加载前被调用(在服务端或切换至目标路由之前)。

head

配置当前页面的Meta标签。
Nuxt.js使用了vue-meta更新应用的头部标签呢(Head)和html属性。
使用head方法设置当前页面的头部标签。
在head方法里可通过this关键字来获取组件的数据,你可以利用页面组件的数据来设置个性化的meta标签。
为了避免子组件中的meta标签不能正确覆盖父组件中相同的标签而产生重复的现象,建议利用hid键为meta标签配一个唯一的标识编号。当父子组件设定了相同的标识值,子组件就会覆盖父组件的配置。

layout属性

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

loading

有三种情况:一种是去掉加载条,一种是个性加载进度条,还有一种是自定义加载组件。
去掉加载条:在nuxt.config.js中设置loading: false。
个性加载进度条:在nuxt.config.js中设置loading: {},里面有很多特性,详情看文档。
自定义加载组件:我们需要在components目录下创建自定义的加载组件,如components/loading.vue:

<template lang="html">
  <div class="loading-page" v-if="loading">
    <p>Loading...</p>
  </div>
</template>

<script>
export default {
  data: () => ({
    loading: false
  }),
  methods: {
    start () {
      this.loading = true
    },
    finish () {
      this.loading = false
    }
  }
}
</script>

<style scoped>
.loading-page {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: rgba(255, 255, 255, 0.8);
  text-align: center;
  padding-top: 200px;
  font-size: 30px;
  font-family: sans-serif;
}
</style>

定义的start()方法和finish()方法是必须的,fail()、increase(num)是非必须的。
然后在nuxt.config.js文件中设置loading:'~/components/loading.vue'。
这里一定要加斜杠,不然会报错This dependency was not found,不知道官网为什么不加也没报错,我犯的错最多的就是路径问题和写错了

以上步骤做完之后需要最后需要在页面组件中调用this.nuxt.loading.start()启动加载条,使用this.nuxt.loading.finish()来使加载条结束。如果在mounted中需要调用this.$nextTick():

export default {
  mounted () {
    this.$nextTick(() => {
      this.$nuxt.$loading.start()

      setTimeout(() => this.$nuxt.$loading.finish(), 500)
    })
  }
 }
transition

Nuxt.js使用Vue.js的<transition>组件来实现路由切换时的过渡动效。如果想给某个页面自定义过渡特效的话,只要在该页面组件中配置transition字段即可:

export default {
   // 可以是字符
   transition: ''
   // 或对象
   transition: {}
   // 或函数
   transition (to, from) {}
}
字符

如果transition属性的值类型是字符类型,相当于设置了动效配置对象的name属性值:transition.name。

export default {
  transition: 'test'
}

Nuxt.js 将使用上面的配置来设置 Vue.js自带的transition 组件,如下:

<transition name="test">

transition组件是Vue.js自带的,并且暴露到全局环境,所以设置的transition都会到添加到组件上。

对象

如果transition属性的值类型是对象类型

export default {
  transition: {
    name: 'test',
    mode: 'out-in'
  }
}

Nuxt.js 将使用上面的配置来设置 Vue.js transition 组件,如下:

<transition name="test" mode="out-in">
函数

如果transition属性的值类型为函数:

export default {
  transition (to, from) {
    if (!from) return 'slide-left'
    return +to.query.page < +from.query.page ? 'slide-right' : 'slide-left'
  }
}
scrollToTop

布尔值,默认:false。用于判定渲染页面前是否需要将当前页面滚动至顶部。这个配置用于嵌套路由的应用场景。

validate

检验方法用于检验动态路由的参数。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容