学习笔记(二十)NuxtJS基础

NuxtJS基础

NuxtJS是什么?

NuxtJS是一个基于Vue生态的第三方开源服务端渲染应用框架

它可以帮助我们轻松的使用Vue技术栈构建同构应用

官网:https://zh.nuxtjs.org

Github仓库:https://github.com/nuxt/nuxt.js

NuxtJS的几种使用方式

  • 使用NuxtJS来初始化创建新的应用(推荐)
    • 使用create-nuxt-app
    • 手动从零创建
  • 对于已有的Node.js服务端项目,直接把Nuxt当做中间件集成到Node Web Server中
  • 对于已有的Vue.js项目,在非常熟悉Nuxt.js的情况下,至少百分之十以上的代码改动来迁移到使用Nuxt.js构建前端SPA应用(不推荐)

从零开始创建NuxtJS应用

  • 创建NuxtJS应用目录nuxt-demo

  • 使用npm init -yyarn init -y初始化

  • 安装NuxtJS相关依赖npm i nuxtyarn add nuxt

  • 修改package.json文件,添加scripts选项

      "scripts": {
        "dev": "nuxt"
      }
    
  • 新建pages目录,并在其中创建index.vue页面组件

    <template>
      <div>hello nuxt</div>
    </template>
    
    <script>
    export default {
    
    }
    </script>
    
    <style>
    </style>
    
  • 执行npm run devyarn dev运行nuxt,nuxt根据默认的选项完成ClientServer端的编译,并启动相应的服务

    image-20210201211847488

路由

基础路由

NuxtJS的路由默认使用约定式路由,即按照约定的规则,根据组件文件路径自动生成路由配置

NuxtJS约定,所有的视图组件应当存放在pages目录下,nuxt在编译时会读取该目录下的所有.vue文件,并自动生成相应的路由配置

pages的目录结构

pages/
--| user/
-----| index.vue
-----| one.vue
--| index.vue
--| about.vue

NuxtJS自动生成的路由配置如下

router: {
    routes: [
        {
            name: 'index',
            path: '/',
            component: 'pages/index.vue'
        },
        {
            name: 'user',
            path: '/user',
            component: 'pages/user/index.vue'
        },
        {
            name: 'user-one',
            path: '/user/one',
            component: 'pages/user/one.vue'
        },
        {
            name: 'about',
            path: '/about',
            component: 'pages/about.vue'
        },
    ]
}

我们可以在编译生成的.nuxt/router.js文件中查看到nuxt自动生成的路由配置

image-20210201221248477

路由导航

NuxtJS中路由导航的几种形式

  • a标签
    • 不推荐使用,会刷新整个页面
  • nuxt-link组件
    • 用法同vue的router-link
  • 编程式导航
    • 用法同vue
<template>
  <div>
    <h1>about me</h1>
    <!-- a链接 会刷新页面 -->
    <h2>a链接</h2>
    <a href="/">首页</a>
    <!-- router-link组件 用法同vue的router-link -->
    <h2>router-link</h2>
    <router-link to="/">首页</router-link>
    <!-- 编程式导航 -->
    <h2>编程式导航</h2>
    <button @click="onClick">首页</button>
  </div>
</template>

<script>
export default {
  name: 'AboutPage',
  methods: {
    onClick () {
      // 编程式导航
      this.$router.push('/')
    }
  }
}
</script>

<style>
</style>

动态路由

NuxtJS的约定式路由支持动态路由,自动生成的动态路由配置与Vue的动态路由配置方式相同

NuxtJS约定使用下划线_前缀的目录或者视图组件文件会被作为动态路由

pages的目录结构

pages/
--| _slug/
-----| index.vue
--| user/
-----| _id.vue
--| index.vue

NuxtJS自动生成的路由配置如下

router: {
    routes: [
        {
            name: 'index',
            path: '/',
            component: 'pages/index.vue'
        },
        {
            name: 'slug',
            path: '/:slug',
            component: 'pages/_slug/index.vue'
        },
        {
            name: 'user-id',
            path: '/user/:id?',
            component: 'pages/user/_id.vue'
        },
    ]
}
  • pages/user/_id.vue生成的路由/user/:id?中包含了?,表示:id这个参数是可选的,如果希望:id参数必选,则必须在_id目录下创建index.vue,即pages/_id/index.vue

  • 动态路由中的参数同样可以使用$route.params.xxx来进行获取

嵌套路由

NuxtJS的约定式路由支持嵌套路由,自动生成的嵌套路由配置与Vue的嵌套路由配置方式相同

NuxtJS约定创建嵌套路由时,需要创建一个.vue视图组件文件,同时需要创建一个同名的目录,用来存放子视图组件

在父组件.vue文件内,需增加<nuxt-child/>作为子视图出口来展示子视图内容

pages的目录结构

pages/
--| user.vue
--| user/
-----| _id.vue
--| index.vue

NuxtJS自动生成的路由配置如下

router: {
    routes: [
        {
            name: 'index',
            path: '/',
            component: 'pages/index.vue'
        },
        {
            name: 'user',
            path: '/user',
            component: 'pages/user.vue'
            children: [{
              path: ":id?",
              component: 'pages/user/_id.vue',
              name: "user-id"
            }]
        },
    ]
}

自定义路由

NuxtJS支持对路由进行一些额外的自定义配置

通过创建自定义配置文件nuxt.config.js,并使用router选项进行配置(具体可使用的自定义配置项参考NuxtJS官网文档)

示例:

// nuxt.config.js
module.exports = {
  router: {
    base: '/abc', // 路由根路径
    extendRoutes (routes, resolve) { // 扩展路由
      routes.push({
        name: 'hello',
        path: '/hello',
        component: resolve(__dirname, 'pages/about.vue')
      })
    }
    ...
  }
}

视图

Nuxt视图结构

image-20210201232244578

模板

NuxtJS默认的HTML页面模板,页面渲染的内容最终会放入{{ APP }}

<!DOCTYPE html>
<html {{ HTML_ATTRS }}>
  <head {{ HEAD_ATTRS }}>
    {{ HEAD }}
  </head>
  <body {{ BODY_ATTRS }}>
    {{ APP }}
  </body>
</html>

也可以通过创建app.html文件来自定义页面模板(重启生效

可以通过自定义app.html的方式来为页面添加额外的JavaScript、CSS文件的引入,官方更推荐通过nuxt.config.js的配置项来达到同样的效果

布局

NuxtJS默认的布局

<template>
  <nuxt />
</template>

我们可以通过创建layouts/default.vue文件来扩展默认布局(重启生效

layouts目录下也可以创建其他的布局文件,布局文件中需要添加<nuxt/>组件来显示页面主体内容,在需要使用该布局的视图组件文件中,通过layout选项来指定布局名称

异步数据

asyncData

NuxtJS扩展了Vue,增加了ayncData方法,使我们能在设置组件数据之前能异步获取或处理数据,可以用来优化首屏渲染与SEO,普通数据则应当初始化到data方法中

  • 基本用法

    • asyncData返回的数据会与组件data方法返回的数据融合一并提供给组件使用
    • 在服务端渲染期间与客户端路由更新之前会被调用
  • 注意事项

    • 只能在页面组件中使用(可以通过页面组件获取异步数据后传递给子组件来使用)
    • 没有this,因为是在组件初始化之前被调用

上下文对象

asyncData接收一个上下文对象context作为参数,由于asyncData在组件初始化之前被调用而无法访问this,我们可以使用上下文对象context来访问上下文相关的一些属性,例如context.params或者context.route.params,等同于this.$route.params(详细的可访问的属性可以参考Nuxt官方文档)

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

推荐阅读更多精彩内容