nuxt项目的文件夹目录
1.nuxt-link组件和router-link组件一样
2.pages文件夹中文件名就是路由路径名(无需配置路由路径),是页面组件。
laouts文件夹,是公共的模板的内容组件,公共的组件<Nuxt />,必须要加
不过在 Nuxt.js 框架中,我们有了新的变化,layouts对应目录中的layouts文件夹,默认pages下的页面走的都是 layouts/default.vue 布局方式,
但是如果自己定义的话,也可以新增新的布局页。其中<nuxt/>可以类似vue中slot插槽的概念,(如果对 slot 插槽不是很明白,
可以看之前的文章 《二十║Vue基础终篇:组件详解+项目说明》的第四节),pages/**.vue中的内容会插在<nuxt/>内。
3.components是普通组件
4.自定义模板组件
在layouts-->新建search.vue, 自定义版本内容
<template>
<div class="layout-search">
<h1>layout search</h1>
<nuxt />
<footer>layout footer</footer>
</div>
</template>
<script>
export default {
data() {
return {}
},
}
</script>
<style scoped lang="css">
.layout-search {
color: red;
}
</style>
在页面组件pages-->新建search.vue(文件名和路由路劲匹配),用layout属性引入模板组件search.vue
<template>
<div></div>
</template>
<script>
export default {
layout: 'search',
data() {
return {}
},
}
</script>
<style scoped lang="css"></style>
在浏览器输入路径。http://localhost:3333/search
5.关于css全局样式的引入,在nuxt. config.js配置
在nuxt.config.js配置, 配置项官网详情,
CONFIGURATION: https://www.nuxtjs.cn/api/configuration-build
module.exports={
dev: process.env.NODE_ENV !== 'production',
// Global page headers: https://go.nuxtjs.dev/config-head
head: {
title: 'mt-app',
htmlAttrs: {
lang: 'en',
},
meta: [
{ charset: 'utf-8' },
{ name: 'viewport', content: 'width=device-width, initial-scale=1' },
{ hid: 'description', name: 'description', content: '' },
],
link: [{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }],
},
// Global CSS: https://go.nuxtjs.dev/config-css
css: ['element-ui/lib/theme-chalk/index.css','~assets/css/main.css'],
// Plugins to run before rendering page: https://go.nuxtjs.dev/config-plugins
plugins: ['@/plugins/element-ui'],
配置 scss
1. 在assets 目录中新建css目录,在css目录中新建 main.scss 文件 main.scss
body: { background: red; }
2. 命令行安装loader yarn add node-sass sass-loader scss-loader -D
3. 在 nuxt.config.js 文件中引入scss文件
css: [ 'element-ui/lib/theme-chalk/index.css', { src: '@/assets/css/main.scss', lang: 'scss' } ],
6. 服务端配置接口异步渲染
新建server-->interface->city.js, 配置路由接口,在index.js引入, 安装npm i koa koa-router
import Router from 'koa-router'
const router = new Router({
prefix: '/city',
})
router.get('/list', async (ctx) => {
ctx.body = {
list: ['beigjin', '天津'],
}
})
export default router
新建server-->index.js, 用babel转化成了es6语法了
import Koa from 'koa'
import { Nuxt, Builder } from 'nuxt'
import cityInterface from './interface/city'
async function start() {
const app = new Koa()
const host = process.env.HOST || '127.0.0.1'
const port = process.env.PORT || 3000
// Import and Set Nuxt.js options
const config = require('../nuxt.config.js')
config.dev = !(app.env === 'production')
// Instantiate nuxt.js
const nuxt = new Nuxt(config)
// Build in development
if (config.dev) {
const builder = new Builder(nuxt)
await builder.build()
}
//固定写法
app.use(cityInterface.routes()).use(cityInterface.allowedMethods())
app.use(ctx => {
ctx.status = 200
ctx.respond = false // Mark request as handled for Koa
ctx.req.ctx = ctx // This might be useful later on, e.g. in nuxtServerInit or with nuxt-stash
nuxt.render(ctx.req, ctx.res)
})
app.listen(port, host)
console.log('Server listening on ' + host + ':' + port) // eslint-disable-line no-console
}
start()
在packjson.json的script中修改服务端的路劲,运行npm run dev
"scripts": {
"dev": "nodemon server/index.js --exec babel-node",
在浏览器中测试接口,输入:http://localhost:3000/city/list
在pages-->search.vue组件中,发送异步请求
注
1.在mouted发送异步请求,浏览器中有动态数据渲染,页面会展示数据,但是源码没有数据,因为在服务端渲染不执行mouted函数
2.在asyncData发送异步请求,会在服务端渲染数据,但是里头没有this(组件实例的),默认是80端口,数据出来没有闪烁(浏览器渲染会闪烁),因为在服务器短渲染的,源码是有数据的
用return 来保存数据, 服务器端把编译好的内容和数据下发给浏览器端
3.fetch和asyncData的效果一样的,都是服务端渲染的,不过它是commit vuex的状态的,而asyncData是在组件中发送数据请求的
<template>
<div>
Page is search
<ul>
<li v-for="(item, index) in list" :key="index">{{ item }}</li>
</ul>
</div>
</template>
<script>
import axios from 'axios'
export default {
layout: 'search',
data() {
return {
list: [],
}
},
// async mounted(){
// const {status, data:{list}} = await axios.get("/city/list")
// if(status ===200){
// this.list = list
// }
// },
async asyncData() {
const { status,data: { list },} = await axios.get('http://localhost:3000/city/list')
if (status === 200) {
return {
list
}
}
},
// async fetch() {
// const { status,data: { list },} = await axios.get('http://localhost:3000/city/list')
// if (status === 200) {
// return {
// list
// }
// }
// },
}
</script>
<style scoped lang="css"></style>
7.nuxt.js项目中vuex的使用,具体用法;
store--》index.js
export const state = () => ({
inis: ['a', 'b']
})
export const mutations = {
INCREASE(state, text) {
state.inis.push(text)
}
}
export const actions = {
increase({commit}, text){
commit('INCREASE', text)
}
}
store-->city.js
export const state = () => ({
list: ['a', 'b']
})
export const mutations = {
ADD(state, text) {
state.list.push(text)
}
}
export const actions = {
add({commit}, text){
commit('ADD', text)
}
}
在组件中使用,并获取数据
<template>
<div>
Page is search
<ul>
<li v-for="(item, index) in list" :key="index">{{ item }}</li>
</ul>
</div>
</template>
<script>
import { mapState, mapMutations, mapActions } from 'vuex';
// import axios from 'axios'
export default {
layout: 'search',
data() {
return {
}
},
computed:{
// ...mapState(['list'])
...mapState({
list:(state)=> state.city.list
})
},
methods:{
// ...mapMutations('city',['ADD'])
...mapActions('city',['add']),
}