介绍
基于 Vue.js 的通用应用框架。 SSR 服务端渲染。在服务端生成html发送至客户端 特性:异步数据加载、中间件支持、布局支持等。 优点:有利于SEO,加载速度快,自动配置路由 依赖 node 和 npm npx(npx在NPM版本5.2.0默认安装)
实现原理
初始化项目
$ npx create-nuxt-app <项目名> (Nuxt.js团队创建了脚手架工具 create-nuxt-app) $ npm run dev (http://localhost:3000)
配置ip地址端口号
若端口号冲突,或想运行在本机ip,在package.json中添加config配置
{
"config":{
"nuxt":{
"host":"127.0.0.1",
"port":"1818"
}
}
}
重启项目即可
路由
根据目录结构自动生层router.js
标签跳转
<nuxt
-link to
="/">跳转首页
</nuxt
-link
>
<nuxt
-link
:to
="{name: 'news',query:{id:'1'}}">跳转新闻页
</nuxt
-link
>
params 传值(id会显示地址栏,其他参数不会显示在地址栏)
this.$router
.push({
name
: 'log-id',
params
:{
id
:12,
key
:value
})
async asyncData ({ params
}) {
}
created () {
this.$route
.params
.xxx
}
query传值(所有的参数都会显示在地址栏)
this.$router
.push({
name
: 'log-id',
query
:{
id
:12,
key
:value
})
async asyncData ({app
,query
}) {
}
created () {
this.$route
.query
.xxx
}
动态路由
动态路由是不同的商品详情对应不同的路由地址,便于搜索引擎收录更多,被搜到的几率更大 文件需以 _ 开头
--| goods
/
-----| _id
.vue
-----| index
.vue
<nuxt
-link
:to
="{name: 'goods-id', params:{id: 1}}">苹果详情
</nuxt
-link
>
<nuxt
-link
:to
=" '/goods/2' ">橘子详情
</nuxt
-link
>
<script
>
export default {
validate({params
}){
return \
^\d
+$\
.test(params
.id
)
}
}
</script
>
嵌套路由
pages
/
--| users
/
-----| _id
.vue
-----| index
.vue
--| users
.vue
父组件(.vue文件) 内增加 用于显示子视图内容
路由切换添加过渡动画
全局动画
在assets文件下新建全局样式文件在 nuxt.config.js 中配置全局common.css
module
.exports
= {
css
: [ '@assets/common.css' ]
}
.page
-enter
-active
, .page
-leave
-active
{
transition
: opacity
.5s
;
}
.page
-enter
, .page
-leave
-active
{
opacity
: 0;
}
单个页面动画
在全局样式里定义单独的过渡样式,然后在所需组件内transition 属性的值设置为 news
.news
-enter
-active
, .news
-leave
-active
{
transition
: all
.5s
;
color
:red
;
}
.news
-enter
, .news
-leave
-active
{
opacity
: 0;
color
:blue
;
}
export default {
transition
: 'news'
}
默认模板和默认布局(优选)
默认模板
在根目录下新建一个app.html 文件
<!DOCTYPE html
>
<html
{{ HTML_ATTRS }}>
<head
{{ HEAD_ATTRS }}>
{{ HEAD }}
</head
>
<body
{{ BODY_ATTRS }}>
<h1
>欢迎光临
</h1
>
{{ APP }}
</body
>
</html
>
默认布局
可通过添加根目录下 layouts/default.vue 文件来扩展应用的默认布局
<template
>
<nuxt
/>
</template
>
自定义布局
在根目录的layouts文件夹下可以定义特殊的布局,例如某个页面需要特殊的头部
<template
>
<div
>
<div
>我的博客导航栏在这里
</div
>
<nuxt
/>
</div
>
</template
>
在所需要的页面中引入自定义的布局
<template
>
<!-- Your template
-->
</template
>
<script
>
export default {
layout
: 'blog'
}
</script
>
自定义错误页面
在layouts文件夹爱下创建 error.vue 文件 layouts/error.vue ,当404 或 500 的时候跳转
<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
>
基本页面
asyncData
在渲染组件之前异步获取数据,即在服务端获取数据并生成页面 如果在mounted中掉接口,则是在组件渲染之后获取到数据,然后通过js渲染在客户端 返回一个数据对象给当前组件,可以直接使用,无需再data中定义 由于asyncData方法是在组件 初始化 前被调用的,所以在方法内是没有办法通过 this 来引用组件的实例对象 同步调用 async/await
axios返回的是promise对象,是异步调用async/await是同步调用,在数据返回成功之后,才会执行后边的操作
<template
>
<h1
class="red">Hello
{{ name
}}!</h1
>
</template
>
<script
>
export default {
data(){
return {
title
:this.$route
.params
.title
}
},
props
:['name'],
async asyncData (context
) {
const { data
} = await axios
.get('')
return { initdata
:data
}
},
async fetch ({ store
, params
}) {
let { data
} = await axios
.get('http://my-api/stars')
store
.commit('setStars', data
)
}
head () {
title
:this.title
,
meta
:{
content
:'描述',
name
:'',
hid
:''
}
},
...
}
</script
>
<style
>
.red
{
color
: red
;
}
</style
>