最近 Vue 用的比较多,而且因为公司里有实习生,当几个人写一个项目的时候,会出现很多问题,最麻烦的就是规范不统一,之前我有一篇文章是说, vue 是比较有规范的一种框架了,但是也会出现很多问题,所以我今天写了一篇规范,也顺便拿出来分享一下

先说下我所使用的技术站:

  1. "dependencies": {
  2. "axios": "^0.17.1",
  3. "element-ui": "^2.0.5",
  4. "vue": "^2.5.2",
  5. "vue-router": "^3.0.1",
  6. "vuex": "^3.0.1"
  7. }

一:关于 axios

1.axios 默认参数添加:
main.js:

  1. axios.defaults.timeout = 5000;
  2. // axios.defaults.baseURL = '/api';//默认全局前缀,build 后可以直接改动这里
  3. //或者
  4. axios.defaults.baseURL = process.env.NODE_ENV === 'development' ? '/api' : ''
  5. //拦截
  6. axios.interceptors.response.use(
  7. response => {
  8. if(response.config.url === "/api/isRegisted"){
  9. return response;
  10. }
  11.  
  12. //若框架是springBoot    
  13. if(response.data.code === 500) {
         if (response.data.msg === '请先登录') {
  14. router.push({
  15. path: '/login',
  16. query: {redirect: router.history.current.fullPath}
  17. })
  18. }
  19. ElementUI.Message({
  20. message: response.data.msg,
  21. center: true,
  22. type: 'warning'
  23. })
  24.  
  25. return Promise.reject(response.data)
  26. }
  27.  
  28.   // 若框架是springMVC
  29. if (res.data && !res.data.success) {
  30. if (res.data.code === '1004') {
  31. router.push({
  32. path: '/login',
  33. query: {redirect: router.history.current.fullPath}
  34. })
  35. }
  36. ElementUI.Message({
  37. message: res.data.msg,
  38. center: true,
  39. type: 'warning'
  40. })
  41. return Promise.reject(res.data.error.message)
  42.   }
  43.  
  44. if(response.data.code === 0){
  45. return response;
  46. }
  47. },
  48. error => {
  49. return Promise.reject(error.response.data)
  50. });

2.axios 挂载:
main.js:
Vue.prototype.axios = axios;

3.axios 封装:
main.js:

  1. const get = (url,params)=>{
  2. return new Promise((resolve, reject) => {
  3. axios.get(url, {params:params})
  4. .then(function (response) {
  5. resolve(response.data);
  6. }).catch(err=>{
    reject(err)
    })
  7. })
  8. };
  9. const post = (url,params)=>{
  10. return new Promise((resolve, reject) => {
  11. axios.post(url, params)
  12. .then(function (response) {
  13. resolve(response.data)
  14. }).catch(err=>{
    reject(err)
    })
  15. })
  16. };
  17.  
  18. Vue.prototype.$api = api;
  19. Vue.prototype.$get = get;
  20. Vue.prototype.$post = post;

在 .vue 页面可以直接使用 this.$get(url,params).then(res=>{}) 和 this.$post(url,params).then(res=>{})
不需要再加 catch;

如果需要对于 loading 动画有需求可以这样使用:

  1. this.loading = true
  2. this.$get(url,params).then(data=>{
  3. this.list = data.page // 对于数据的操作
  4. }).then(()=>{
  5. this.loading = false
  6. })
  7. // 第二个 then 是不论 ajax 的结果是正常还是异常,都会触发
  8.  
  9. // 如若对于 catch 有需求则再添加 catch

  

如果仍然有其他特殊参数的请求 可以直接调用 this.axios.get();

使用 this.axios 时必须加上 catch

二. vuex
1.ajax 判断
首先 ajax 请求可以写在 actions也可以直接写在 .vue 页面里;
我们判断的依据是 回调是否需要调用页面结构来区分,
比如在 .vue 页面中 发送完请求后需要调用 this.$refs.element等,或者需要利用组件的独立性的效果时 的那就写在.vue页面,否则就写在 actions 里

3.ajax 调用

  1. 因为异步的原因,不能将 get,post挂载到 vuex 上面,
  2. 所以新增 fetch.js 页面:
  3. import axios from 'axios'
  4. import api from './index.js'//api页面
  5. const get = (url,params)=>{
  6. return new Promise((resolve, reject) => {
  7. axios.get(url, {params:params})
  8. .then(function (response) {
  9. resolve(response.data);
  10. }).catch(err=>{})
  11. })
  12. };
  13. const post = (url,params)=>{
  14. return new Promise((resolve, reject) => {
  15. axios.post(url, params)
  16. .then(function (response) {
  17. resolve(response.data)
  18. }).catch(err=>{})
  19. })
  20. };
  21. export {api,get,post};
  22.  
  23. vuex 页面中引入:import {api,get} from '@/api/fetch.js'
  24. 即可发起请求:
  25. getUser({commit}){
  26. get(api.info).then(data=>{
  27. commit('changeUser',data)
  28. })
  29. }
  30.  
  31. 如有特殊需要可以新引入 axios 或者在 fetch 上在进行特殊的添加

3.模块
按类型分类,将响应模块的state,mutations,actions等分别写在对应文件中,登录,注册,修改密码等写在index 中

三.路由
1.路由需登录
在创建路由时,添加的一个例子:
{
path: 'bar',
component: Bar,
meta: { requireLogin: true }
}
在需要登录的页面添加 meta:{ requireLogin: true } 这个元素
作用是在含有这个元素的页面是需要登陆后才能使用的;
起作用需要在 main.js 里设置

  1. router.beforeEach((to, from, next) => {
  2. if (to.matched.some(record => record.meta.requireLogin)) {
  3. if ([判断登录信息]) {
  4. next({
  5. path: '/login',
  6. query: { redirect: to.fullPath }
  7. })
  8. } else {
  9. next()
  10. }
  11. } else {
  12. next()
  13. }
  14. })

关于详细的登录检验我都放置在了我的另一个博客中:http://www.cnblogs.com/Grewer/p/8440726.html

2.路由name;
路由都添加 name 字段,格式是路由格式的简化,采用驼峰命名,比如
{
path: '/foo/bar',
name:'fooBar',
component: Bar
}

四: api管理
1.新建src/api/index.js;
放置 api路径 要注意 axios已经有了前缀,所以这里的 api 值需要些前缀之后的路径
当路径较多时可以再多建几个文件,分类放置

2.挂载

在 main.js 里 import api from './api/index'

使用 Vue.prototype.$api = api 挂载到原型链上,

在 Vuex 里引入有 fetch页面了,这个页面已经将 api 引入了

我抽空写了一个简单的转换工具,可以简化 API 的编写:

https://www.npmjs.com/package/vueapimanage

github:https://github.com/Grewer/vueApiManage  欢迎 star

完;

分享一篇vue项目规范的更多相关文章

  1. 分享我在 vue 项目中关于 api 请求的一些实现及项目框架

    本文主要简单分享以下四点 如何使用 axios 如何隔离配置 如何模拟数据 分享自己的项目框架 本文主要目的为以下三点 希望能够帮到一些人 希望能够得到一些建议 奉上一个使用Vue的模板框架 我只是把 ...

  2. 实现h5公众号分享功能(vue项目也适用)

    在vue项目中我们先npm install weixin-js-sdk --save下载下来在main.js文件中引入 import wx from 'weixin-js-sdk';//引入 Vue. ...

  3. vue 项目规范

    1, 组件化 2, css 分清单独和通用的 3, 封装请求 4, 命名原则 1: 尽量和后端保持一致 2: 简单常见的单词 3: 全部小写

  4. vue项目中使用bpmn-节点篇

    前情提要 根据之前的操作,我们可以创建.导入.导出流程图,并对其进预览.通过此篇可以学到: 为节点添加点击.鼠标悬浮等事件 获取流程图内所有指定类型的节点 通过外部更新节点名字 获取节点实例的两种方法 ...

  5. vue项目中使用bpmn-番外篇(留言问题总结)

    前情提要 “vue项目中使用bpmn-xxxx”系列的七篇文章在上周已经更新完成,发表后,有小伙伴在使用时提出了一些文章中没有讲到的问题,此篇作为番外篇,将大家提出的共性问题解答一下,欢迎大家支持原创 ...

  6. vue项目中使用bpmn-为节点添加颜色

    内容概述 本系列 “vue项目中使用bpmn-xxxx” 分为五篇,均为自己使用过程中用到的实例,手工原创,目前属于陆续更新中.主要包括vue项目中bpmn使用实例.应用技巧.基本知识点总结和需要注意 ...

  7. vue项目中使用bpmn-自定义platter

    前情提要 经过前四篇的学习,我们能够实现bpmn基本绘图.预览.为节点加事件加颜色等效果,这一篇我们来说,如何自定义左侧工具栏(platter),首先看一下自定义前后效果图对比: 我们本次要实现的目标 ...

  8. vue项目中使用bpmn-流程图xml文件中节点属性转json结构

    内容概述 本系列“vue项目中使用bpmn-xxxx”分为七篇,均为自己使用过程中用到的实例,手工原创,目前陆续更新中.主要包括vue项目中bpmn使用实例.应用技巧.基本知识点总结和需要注意事项,具 ...

  9. [转]Vue项目全局配置微信分享思路详解

    这篇文章给大家介绍了vue项目全局配置微信分享思路讲解,使用vue作为框架,使用vux作为ui组件库,具体内容详情大家跟随脚本之家小编一起学习吧 这个项目为移动端项目,主要用于接入公众号服务.项目采用 ...

随机推荐

  1. CSS盒子模型之详解

    前言:        盒子模型是css中最核心的基础知识,理解了这个重要的概念才能更好的排版,进行页面布局.一.css盒子模型概念    CSS盒子模型 又称框模型 (Box Model) ,包含了元 ...

  2. win8.1 安装

    下载了Windows8.1企业版的iso文件,文件名称:cn_windows_8_1_enterprise_x86_dvd_2791409.iso 下载地址: http://msdn.itellyou ...

  3. 窗口迅速关闭的解决办法/scanf/if/for/break

    break if的格式 if(a>b) { printf("max=%d\n",a); } else printf("max=%d\n",b); scan ...

  4. 走进 UITest for Xamarin.Forms

    上一篇  走进 Prism for Xamarin.Forms 讲了简单的创建一个项目,然后添加了几个页面来回切换,这篇想先搞下 UITest 官方详细地址:https://developer.xam ...

  5. mysql5.7在windows不能启动的方法及查看数据库大小命令

    1.将mysql目录下的my-default.ini改为my.ini 2.cmd进入mysql的bin目录下 3.执行mysqld --initialize进行初始化(如果mysql目录下已经存在da ...

  6. 我推荐的 Java Web 学习路线

    晚上再 V2 的 Java 的节点看到有人问 Java Web 书籍推荐.我这半年多的时间,也从别的方向开始转向 Java 服务端开发,所以,我来说下我的学习路线,帮助有需要的朋友把半只脚踏进 Spr ...

  7. python函数下篇装饰器和闭包,外加作用域

    装饰器和闭包的基础概念 装饰器是一种设计模式能实现代码重用,经常用于查日志,性能测试,事务处理等,抽离函数大量不必的功能. 装饰器:1.装饰器本身是一个函数,用于装饰其它函数:2.功能:增强被装饰函数 ...

  8. Ionic3 创建应用(Android)

    打开CMD 通过命令行进入项目目录 创建一个App项目 ionic start myApp blank 空白App ionic start myApp tabs 导航条 ionic start myA ...

  9. 【机器学习实战】第12章 使用FP-growth算法来高效发现频繁项集

    第12章 使用FP-growth算法来高效发现频繁项集 前言 在 第11章 时我们已经介绍了用 Apriori 算法发现 频繁项集 与 关联规则.本章将继续关注发现 频繁项集 这一任务,并使用 FP- ...

  10. 使用chart和echarts制作图表

      前  言 chart.js是一个简单.面向对象.为设计者和开发者准备的图表绘制工具库.它可以帮你用不同的方式让你的数据变得可视化.每种类型的图表都有动画效果,并且看上去非常棒,即便是在retina ...