NuxtJS踩坑

1.初始化Nuxt项目

vue init nuxt/starter

2.各目录作用

|-- .nuxt                            // Nuxt自动生成,临时的用于编辑的文件,build
|-- assets                           // 用于组织未编译的静态资源入LESS、SASS 或 JavaScript
|-- components                       // 用于自己编写的Vue组件,比如滚动组件,日历组件,分页组件
|-- layouts                          // 布局目录,用于组织应用的布局组件,不可更改。
|-- middleware                       // 用于存放中间件
|-- pages                            // 用于存放写的页面,我们主要的工作区域
|-- plugins                          // 用于存放JavaScript插件的地方
|-- static                           // 用于存放静态资源文件,比如图片
|-- store                            // 用于组织应用的Vuex 状态管理。
|-- .editorconfig                    // 开发工具格式配置
|-- .eslintrc.js                     // ESLint的配置文件,用于检查代码格式
|-- .gitignore                       // 配置git不上传的文件
|-- nuxt.config.json                 // 用于组织Nuxt.js应用的个性化配置,已覆盖默认配置
|-- package-lock.json                // npm自动生成,用于帮助package的统一性设置的,yarn也有相同的操作
|-- package-lock.json                // npm自动生成,用于帮助package的统一性设置的,yarn也有相同的操作
|-- package.json                     // npm包管理配置文件
配置ip和端口号

//package.json

"config": {
    "nuxt": {
      "host": "localhost",
      "port": "3000"
    }
 },
配置公共css
//首先需要在assets下建需要用的css文件,然后在nuxt.config.js下写
css:['~assets/css/xxxxx.csss']

3.路由

路由跳转
<nuxt-link :to="{name:'index'}">home</nuxt-link>
//传参,params和query都可以传参,获取方式和vue一样
<nuxt-link :to="{name:'news-id',params:{id:123,title:'i am news'}}">new1</nuxt-link> 
<nuxt-link :to="{path:'/news/456'}">new2</nuxt-link>
动态路由
//在目录里建_xxx.vue
<nuxt-link :to="{name:'news-xxx',params:{id:123,title:'i am news'}}">new1</nuxt-link>
<nuxt-link :to="{path:'/news/456'}">new2</nuxt-link>
//参数校验 _xxx.vue
export default {
  validate ({ params }) {
    // Must be a number
    return /^\d+$/.test(params.id)
  }
}
路由动画效果
//全局效果
.page-enter-active, .page-leave-active {
    transition: opacity 2s;
}
.page-enter, .page-leave-active {
    opacity: 0;
}
//局部页面效果
.news-enter-active,.news-leave-active {
  transition: all 1s;
  font-size: 16px;
}

.news-enter,.news-leave-active {
  opacity: 0;
  font-size: 20px;
}
//然后在需要的页面写入这个动画名字
export default {
  transition:'news'
}

4.默认模板和默认布局

//默认模板
<!DOCTYPE html>
 <html lang="en">
      <head>
        {{ HEAD }}
      </head>
      <body>
       {{ APP }}
      </body>
</html>
//默认布局
<template>
  <div>
    <h1>xxxx</h1>
    <nuxt/>
  </div>
</template>

5.自定义错误页面和自定义meta

//在根目录下的layouts文件夹下建立一个error.vue文件
<template>
  <div>
      <h2 v-if="error.statusCode==404">404页面不存在</h2>
      <h2 v-else>500服务器错误</h2>
      <ul>
          <li><nuxt-link to="/">HOME</nuxt-link></li>
      </ul>
  </div>
</template>

<script>
export default {
  props:['error'],
}
</script>
//自定义meta
export default {
    head() {
          return {
            title: 'xxxx',
            meta: [
                { hid: 'description', name: 'news1', content: 'This is news page' }
            ]
    }
  }
}

6.异步请求

npm install axios --save
//跨域
npm i @nuxtjs/axios @nuxtjs/proxy --save-dev
//封装axios,plugins下创建http.js
//http.js
import axios from 'axios'


axios.defaults.headers['X-Requested-With'] = 'XMLHttpRequest'
axios.defaults.headers.post['Content-Type'] = 'text/plain;charset=UTF-8'
let service = axios.create({
    // baseURL: '/',
    timeout: 10000
})

// 请求拦截 可在请求头中加入token等
service.interceptors.request.use(config => {
    return config
}, error => {
    return Promise.reject(error)
})

// 响应拦截 对响应消息作初步的处理
service.interceptors.response.use(resp => {
    if (resp.data) {
        if (resp.data.code !== 200) {
            console.log(res.data.error)
        }
        return { code: resp.data.code, data: resp.data.data, msg: resp.data.error }
    } else {
        return resp
    }
}, error => {
    if (error.response) {
        switch (error.response.status) {
            case 400: {
                if (error.response && error.response.data && error.response.data.error) {
                    console.log(res.data.error)
                }
                break
            }
        }
    }
})

export default service
//统一封装一下接口,根目录下创建api文件夹,然后创建user.js
import request from '@/plugins/http'

export const getList = () => {
    return request({
        url: '/api/ranking_list?aid=6',
        method: 'get'
    })
}
//nuxt.config.js配置跨域
plugins: [
    { src: "~plugins/http.js", ssr: true }
  ],
  modules: [
    '@nuxtjs/axios',
    "@nuxtjs/proxy"
  ],
  axios: {
    proxy: true,
    retry: { retries: 3 },
    //开发模式下开启debug
    debug: process.env._ENV == "production" ? false : true,
    //设置不同环境的请求地址
    baseURL:
      process.env._ENV == "production"
        ? "http://localhost:3000/api"
        : "http://localhost:3000/api",
    withCredentials: true,
    headers: { 'Content-Type': 'application/json', 'crossDomain': true },
    timeout: 5000,
  },
  proxy: {
    '/api': {
      target: 'http://xxxx.cn',
      changeOrigin: true,
      pathRewrite: {
        '^/api': '/api'
      }
    }
  },
//防止axios二次打包
build:{
    vendor: ['axios'],
}
//使用方法
<script>
import { getList } from '@/api/user'
export default {
  data() {
    return {
       info: []
    };
  },
//方法一
  asyncData() {
      return getList()
        .then(res => {
           return { info: res.data }
        })
  },
//方法二
  async asyncData() {
       let { code, data } = await getList()
       console.log(data)
       return { info: data }
  },
  mounted() {
//方法三
    getList().then(res => {
      this.info = res.data
      console.log(res)
    }).catch(err => {
      console.log(err)
    })
  },

};
</script>

7.静态资源打包

<div><img src="~static/logo.png" /></div>
//背景图
<style>
  .box{
    width: 300px;
    height: 100px;
    background-image: url('~static/logo.png')
  }
</style>
//打包 
npm run generate
//输出的dist文件夹扔服务器上就可以了

8.vuex的使用

//store文件夹下建模块文件user.js
export const state = () => ({   //state里面存放的是变量,如果你要注册全局变量,写这里
    isLogin: false,
});
/*const getters = {     //getters相当于是state的计算属性,如果你需要将变量的值进行计算,然后输出,写这里
include: (state) => (val) => {
return state.list.indexOf(val) > -1;
}
}
;*/
const mutations = {       //修改store中的变量的方法,如果你要改变变量的值,就写这(vuex中state中的值不能直接修改)
    SET_isLogin(state, value) {
        state.isLogin = value;
    }
};
/*const actions = {//actions提交的是mutations,相当于就是改变变量的方法的重写,但是,actions是可以进行异步操作的
async SET_isLogin({state, commit}, val) {
commit('SET_isLogin', val);
}
};*/

export default {
    namespaced: true,//命名空间
    state,//这里你用到了哪几个属性就写哪几个,不需要的可以注释掉
    // getters,
    // actions,
    mutations
};
//使用方法
computed:{
      ...mapState('user',{  //前面三个 . 不是多余的!! 第一个参数是模块名称(就是js文件名),后面是{变量名:state => 回调函数 }  这个在后面还会讲一下
        isLogin:state=>state.isLogin
      }),
},
methods: {
      // 获取vuex中修改isLogin的方法 , 三个 . 也不能掉 , 数组的地方都是可以写多个
      // ...mapMutations('模块名',['导出的方法名称']),
      ...mapMutations('user',['SET_isLogin']),
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351