Nuxt.js教程(入门篇)

目录
一、路由
二、视图
三、异步数据
四、插件

系列教程
Nuxt.js教程(初识篇)


一、路由

1、基础路由
pages/
--| user/
-----| index.vue
-----| one.vue
--| index.vue

//自动转换成以下路由配置,因此,管理pages目录内容,就相当于配置路由

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'
    }
  ]
}
2、动态路由
pages/
--| _slug/
-----| comments.vue
-----| index.vue
--| users/
-----| _id.vue    //users没有路由组件,_id是可选路由
--| index.vue

//加上‘_’前缀,即可配置动态路由

router: {
  routes: [
    {
      name: 'index',
      path: '/',
      component: 'pages/index.vue'
    },
    {
      name: 'users-id',
      path: '/users/:id?',
      component: 'pages/users/_id.vue'
    },
    {
      name: 'slug',
      path: '/:slug',
      component: 'pages/_slug/index.vue'
    },
    {
      name: 'slug-comments',
      path: '/:slug/comments',
      component: 'pages/_slug/comments.vue'
    }
  ]
}
3、动态路由校验
//动态路由的层级名,是由相应组件的validate函数,通过名称验证来决定的

//  user/_id.vue
export default {
    validate ({ params }) {
    // 规定改层级名,必须是数字
    // localhost:3000/user/任意数字串,才可以访问该组件
    return /^\d+$/.test(params.test)
    }
}
4、嵌套路由
pages/
--| users/
-----| _id.vue
-----| index.vue
--| users.vue

//将页面级的路由组件,抽离成单独组件,内部存在小型路由组件

router: {
  routes: [
    {
      path: '/users',
      component: 'pages/users.vue',
      children: [
        {
          path: '',
          component: 'pages/users/index.vue',
          name: 'users'
        },
        {
          path: ':id',
          component: 'pages/users/_id.vue',
          name: 'users-id'
        }
      ]
    }
  ]
}
5、动态嵌套路由
pages/
--| _category/
-----| _subCategory/
--------| _id.vue
--------| index.vue
-----| _subCategory.vue
-----| index.vue
--| _category.vue
--| index.vue

router: {
  routes: [
    {
      path: '/',
      component: 'pages/index.vue',
      name: 'index'
    },
    {
      path: '/:category',
      component: 'pages/_category.vue',
      children: [
        {
          path: '',
          component: 'pages/_category/index.vue',
          name: 'category'
        },
        {
          path: ':subCategory',
          component: 'pages/_category/_subCategory.vue',
          children: [
            {
              path: '',
              component: 'pages/_category/_subCategory/index.vue',
              name: 'category-subCategory'
            },
            {
              path: ':id',
              component: 'pages/_category/_subCategory/_id.vue',
              name: 'category-subCategory-id'
            }
          ]
        }
      ]
    }
  ]
}
6、未知路由
pages/
--| people/
-----| index.vue
--| _.vue    //localhost:3000、localhost:3000/people以外的路径,都会匹配到_.vue这一页面级路由组件
--| index.vue

//可用作错误页
7、命名视图
//使用命名视图,需要先配置

//nuxt.config.js
export default {
  router: {
    extendRoutes(routes, resolve) {
      let index = routes.findIndex(route => route.name === 'main')
      routes[index] = {
        ...routes[index],
        components: {
          default: routes[index].component,
          top: resolve(__dirname, 'components/mainTop.vue')
        },
        chunkNames: {
          top: 'components/mainTop'
        }
      }
    }
  }
}
8、过渡效果
//全局过渡

//assets/main.css
.page-enter-active, .page-leave-active {
  transition: opacity .5s;
}
.page-enter, .page-leave-active {
  opacity: 0;
}

//nuxt.config.js
css: [
  'assets/main.css'
]


//局部过渡

//assets/test.css
.test-enter-active, .test-leave-active {
  transition: opacity .5s;
}
.test-enter, .test-leave-active {
  opacity: 0;
}

//nuxt.config.js
css: [
  'assets/test.css'
]

//test.vue
export default {
  transition: 'test'
}
9、中间件???????????????


二、视图

??????????????嵌套关系

1、模板
//根目录下,新建app.html

//app.html


  
    {{ HEAD }}
  
  
    {{ APP }}    //layout
  


//插值表达式受配置文件控制

PS:新建app.html后,重启服务器,才有模板效果。

2、布局
//默认布局

//  layouts/default.vue



//自定义布局

//  layouts/myLayout.vue


//标识需要套用myLayout.vue的page组件
export default {
  layout: 'myLayout'
}


//错误布局(存放在layout目录的page)

//  layouts/error.vue



4、页面

特殊配置项

名称 功能
asyncData 最重要的一个键, 支持异步数据处理,另外该方法的第一个参数为当前页面组件的上下文对象
fetch 与asyncData方法类似,用于在渲染页面之前获取数据填充应用的状态树(store)。不同的是fetch方法不会设置组件的数据
head 配置当前页面的 Meta 标签
layout 指定当前页面使用的布局(layouts根目录下的布局文件)
loading 如果设置为false,则阻止页面自动调用this.$nuxt.$loading.finish()和this.$nuxt.$loading.start()
transition 指定页面切换的过渡动效
scrollToTop 布尔值,默认false。 用于判定渲染页面前是否需要将当前页面滚动至顶部
validate 校验方法用于校验动态路由
middleware 指定页面的中间件,中间件会在页面渲染之前被调用
5、html头部
//nuxt.js使用vue-meta管理html头部

//nuxt.config.js
head: {
  meta: [
    { charset: 'utf-8' },
    { name: 'viewport', content: 'width=device-width, initial-scale=1' }
  ],
  link: [
    { rel: 'stylesheet', href: 'https://fonts.googleapis.com/css?family=Roboto' }
  ]
}

三、异步数据

1、asyncData方法

(1)触发时刻
asyncData方法会在组件(限于页面组件)每次加载之前被调用,它可以在服务端或路由更新之前被调用。

(2)案例

export default {
  //参数:当前页面的上下文对象
  async asyncData ({ params }) {
    let { data } = await axios.get(`https://my-api/posts/${params.id}`)
    return { title: data.title }
  }
}
2、上下文对象

(1)使用 req / res 对象

//服务器端调用asyncData
export default {
  async asyncData ({ req, res }) {
    // 请检查您是否在服务器端
    // 使用 req 和 res
    if (process.server) {
     return { host: req.headers.host }
    }

    return {}
  }
}

(2)访问动态路由数据

//访问路由对象的params
export default {
  async asyncData ({ params }) {
    return { params }
  }
}
3、错误处理
export default {
  asyncData ({ params, error }) {
    return axios.get(`https://my-api/posts/${params.id}`)
    .then((res) => {
      return { title: res.data.title }
    })
    .catch((e) => {
      error({ statusCode: 404, message: 'Post not found' })
    })
  }
}

四、插件

1、Vue插件
//vue插件使用前,必须做相应的配置

//nuxt.config.js
//plugins目录的vue插件
plugins: ['plugins/插件名']

//node_modules目录的vue插件
build: {
  transpile: ['插件名']
}
2、注入

(1)注入到Vue实例

//  plugins/vue-inject.js
import Vue from 'vue'
Vue.prototype.$myInjectedFunction = (string) => console.log("This is an example", string)

//nuxt.config.js
export default {
  plugins: ['~/plugins/vue-inject.js']
}

//example-component.vue
export default {
  mounted(){
    this.$myInjectedFunction('test')
  }
}

(2)注入到context

//  plugins/ctx-inject.js
export default ({ app }, inject) => {
  app.myInjectedFunction = (string) => console.log('Okay, another function', string)
}

//nuxt.config.js
export default {
  plugins: ['~/plugins/ctx-inject.js']
}

//ctx-example-component.vue
export default {
  asyncData(context){
    context.app.myInjectedFunction('ctx!')
  }
}

(3)注入到Vue实例、context、Vuex

//  plugins/combined-inject.js
export default ({ app }, inject) => {
  inject('myInjectedFunction', (string) => console.log('That was easy!', string))
}

//nuxt.config.js
export default {
  plugins: ['~/plugins/combined-inject.js']
}

//ctx-example-component.vue
export default {
  mounted(){
    this.$myInjectedFunction('works in mounted')
  },
  asyncData(context){
    context.app.$myInjectedFunction('works with context')
  }
}

//  store/index.js
export const state = () => ({
  someValue: ''
})

export const mutations = {
  changeSomeValue(state, newValue) {
    this.$myInjectedFunction('accessible in mutations')
    state.someValue = newValue
  }
}

export const actions = {
  setSomeValueToWhatever ({ commit }) {
    this.$myInjectedFunction('accessible in actions')
    const newValue = "whatever"
    commit('changeSomeValue', newValue)
  }
}
3、只在客户端使用的插件
//规定插件使用环境,客户端/服务器端

//nuxt.config.js
//旧版本
plugins: [
  { src: '~/plugins/both-sides.js' },
  { src: '~/plugins/client-only.js', ssr: 'false' },
  { src: '~/plugins/server-only.js', ssr: 'true' }
]

//Nuxt.js 2.4+
plugins: [
  { src: '~/plugins/both-sides.js' },
  { src: '~/plugins/client-only.js', mode: 'client' },
  { src: '~/plugins/server-only.js', mode: 'server' }
]

模块

介绍
Nuxt.js模块列表
基本模块
异步模块
常见模块


Vuex状态树

使用状态树
fetch方法
nuxtServerInit方法

你可能感兴趣的:(Nuxt.js教程(入门篇))