學習筆記(二十)NuxtJS基礎

NuxtJS基礎

NuxtJS是什么?

NuxtJS是一個基于Vue生態(tài)的第三方開源服務端渲染應用框架

它可以幫助我們輕松的使用Vue技術(shù)棧構(gòu)建同構(gòu)應用

官網(wǎng):https://zh.nuxtjs.org

Github倉庫:https://github.com/nuxt/nuxt.js

NuxtJS的幾種使用方式

  • 使用NuxtJS來初始化創(chuàng)建新的應用(推薦)
    • 使用create-nuxt-app
    • 手動從零創(chuàng)建
  • 對于已有的Node.js服務端項目,直接把Nuxt當做中間件集成到Node Web Server中
  • 對于已有的Vue.js項目,在非常熟悉Nuxt.js的情況下,至少百分之十以上的代碼改動來遷移到使用Nuxt.js構(gòu)建前端SPA應用(不推薦)

從零開始創(chuàng)建NuxtJS應用

  • 創(chuàng)建NuxtJS應用目錄nuxt-demo

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

  • 安裝NuxtJS相關(guān)依賴npm i nuxtyarn add nuxt

  • 修改package.json文件,添加scripts選項

      "scripts": {
        "dev": "nuxt"
      }
    
  • 新建pages目錄,并在其中創(chuàng)建index.vue頁面組件

    <template>
      <div>hello nuxt</div>
    </template>
    
    <script>
    export default {
    
    }
    </script>
    
    <style>
    </style>
    
  • 執(zhí)行npm run devyarn dev運行nuxt,nuxt根據(jù)默認的選項完成ClientServer端的編譯,并啟動相應的服務

    image-20210201211847488

路由

基礎路由

NuxtJS的路由默認使用約定式路由,即按照約定的規(guī)則,根據(jù)組件文件路徑自動生成路由配置

NuxtJS約定,所有的視圖組件應當存放在pages目錄下,nuxt在編譯時會讀取該目錄下的所有.vue文件,并自動生成相應的路由配置

pages的目錄結(jié)構(gòu)

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>

動態(tài)路由

NuxtJS的約定式路由支持動態(tài)路由,自動生成的動態(tài)路由配置與Vue的動態(tài)路由配置方式相同

NuxtJS約定使用下劃線_前綴的目錄或者視圖組件文件會被作為動態(tài)路由

pages的目錄結(jié)構(gòu)

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這個參數(shù)是可選的,如果希望:id參數(shù)必選,則必須在_id目錄下創(chuàng)建index.vue,即pages/_id/index.vue

  • 動態(tài)路由中的參數(shù)同樣可以使用$route.params.xxx來進行獲取

嵌套路由

NuxtJS的約定式路由支持嵌套路由,自動生成的嵌套路由配置與Vue的嵌套路由配置方式相同

NuxtJS約定創(chuàng)建嵌套路由時,需要創(chuàng)建一個.vue視圖組件文件,同時需要創(chuàng)建一個同名的目錄,用來存放子視圖組件

在父組件.vue文件內(nèi),需增加<nuxt-child/>作為子視圖出口來展示子視圖內(nèi)容

pages的目錄結(jié)構(gòu)

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支持對路由進行一些額外的自定義配置

通過創(chuàng)建自定義配置文件nuxt.config.js,并使用router選項進行配置(具體可使用的自定義配置項參考NuxtJS官網(wǎng)文檔)

示例:

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

視圖

Nuxt視圖結(jié)構(gòu)

image-20210201232244578

模板

NuxtJS默認的HTML頁面模板,頁面渲染的內(nèi)容最終會放入{{ APP }}

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

也可以通過創(chuàng)建app.html文件來自定義頁面模板(重啟生效

可以通過自定義app.html的方式來為頁面添加額外的JavaScript、CSS文件的引入,官方更推薦通過nuxt.config.js的配置項來達到同樣的效果

布局

NuxtJS默認的布局

<template>
  <nuxt />
</template>

我們可以通過創(chuàng)建layouts/default.vue文件來擴展默認布局(重啟生效

layouts目錄下也可以創(chuàng)建其他的布局文件,布局文件中需要添加<nuxt/>組件來顯示頁面主體內(nèi)容,在需要使用該布局的視圖組件文件中,通過layout選項來指定布局名稱

異步數(shù)據(jù)

asyncData

NuxtJS擴展了Vue,增加了ayncData方法,使我們能在設置組件數(shù)據(jù)之前能異步獲取或處理數(shù)據(jù),可以用來優(yōu)化首屏渲染與SEO,普通數(shù)據(jù)則應當初始化到data方法中

  • 基本用法

    • asyncData返回的數(shù)據(jù)會與組件data方法返回的數(shù)據(jù)融合一并提供給組件使用
    • 在服務端渲染期間與客戶端路由更新之前會被調(diào)用
  • 注意事項

    • 只能在頁面組件中使用(可以通過頁面組件獲取異步數(shù)據(jù)后傳遞給子組件來使用)
    • 沒有this,因為是在組件初始化之前被調(diào)用

上下文對象

asyncData接收一個上下文對象context作為參數(shù),由于asyncData在組件初始化之前被調(diào)用而無法訪問this,我們可以使用上下文對象context來訪問上下文相關(guān)的一些屬性,例如context.params或者context.route.params,等同于this.$route.params(詳細的可訪問的屬性可以參考Nuxt官方文檔)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容