写在前面
玩vue已经快一年了,回首第一次遇见vue的时候,还是大二的暑假,一晃已经走完了大三。我们都知道编程的学习是分软功和硬功的。外练筋骨皮,内练一口气就是这个道理。
那么什么是硬功呢?硬功就是Vue语法的掌握,JS语法的掌握等等。
那么什么是软功呢?算法思想,编程思想,架构思想。
思想思想,对咯,软功就是思和想。一个没有思想的程序员,只知道重复搬砖,不知道造轮子,组装汽车的程序员,我们亲切的称之为‘码农’。
虽然我现在连码农都算不上
这篇博客我将为你介绍vue的架构思想,当然这只是我根据遇到的项目总结的vue架构,这是我发现的一个小三轮,如果你有好的架构也欢迎指教哦。
好了,我们开始聊吧!
以我手撸的一个小项目 高仿饿了么外卖平台 为例:线上演示地址
最初的版本
目录结构
├── src // 生产目录│ ├── api // axios操作│ ├── components // 组件 │ │ ├── common // 公共组件│ │ ├── admin // 用户组件│ │ └── seller // 商家组件 │ ├── router // 路由│ ├── store // vuex状态管理器│ ├── App.vue // 首页│ └── main.js // Webpack 预编译入口 12345678910
代码逻辑
很简单先访问App.vue,根据路由映射不同组件渲染页面,每个页面都有ajax请求
ajax请求长这样
getUserInfo: function() { this.axios.get('user/infor')
.then(res => { if (res.data.status) { this.user = res.data.data;
}
})
.catch(error => { console.log(error);
});
},1234567891011前端第一次重构
2018 4月21日
目录结构
├── src // 生产目录│ ├── api // axios操作│ ├── components // 组件 │ ├── router // 路由│ ├── store // vuex状态管理器│ ├── App.vue // 首页│ └── main.js // Webpack 预编译入口1234567
没错只是将ajax请求都集中到了api目录下
api目录下的index.js文件
import axios from 'axios';
import store from '../store';let httpURL = "http://www.xuguobin.club/api/elm/" //这是我服务器的api接口let localURL = 'http://localhost/api/elm/'; //这是本地koa2的api接口axios.defaults.baseURL = localURL;
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
export default { //获取用户信息
getUser() { return axios.get('user/infor');
}, //获取订单
getOrders(orderType) { return axios.get('user/order?type=' + orderType);
}, //提交订单
submitOrder(order) { return axios.get('user/submit?order=' + order);
}, //确认收货
confirmOrder(orderId) { return axios.get('user/confirm?orderId=' + orderId);
}, //提交评价
submitRating(rating) { return axios.get('user/rating?rating=' + rating);
}, //用户登录
userLogin(user) { return axios.post('user/login',`username=${user.username}&password=${user.password}`);
},
};12345678910111213141516171819202122232425262728293031323334这样子做,很好的将axios请求与vue页面解耦和了!
现在ajax请求长这样
getUserInfo: function() {
this.api.getUser() .then(res => {
if (res.data.status) {
this.user = res.data.data;
}
}) .catch(error => {
console.log(error);
});},1234567891011前端第二次重构
2018 7月8日
Github地址:elm2.0
目录结构
讲道理这次重构的有点过分
├── src // 生产目录│ └── axios // axios操作| ├──base // axios模板| | ├──base.js //axios基类| | └──setting.js //状态码| └── user| ├──cache.js //请求函数| └──config.js //配置信息|| ├── base //vue模板│ ├── components // 组件| | ├──common //公共组件| | └──admin| | ├── ui.vue // 输出组件| | ├── component.html // template| | ├── component.js // script| | └── component.less // style| | │ ├── router // 路由│ ├── store // vuex状态管理器│ ├── App.vue // 首页│ └── main.js // Webpack 预编译入口12345678910111213141516171819202122
第一次的重构虽然已经将axios请求和页面分离开来了,但是每次请求后都要验证状态码,处理错误信息。
其实这完全没有必要每个页面都来一下,这些公共操作可以一起放在axios的基类
import axios from 'axios'import setting from './setting'let httpURL = "http://www.xuguobin.club/api/elm/" //这是我服务器的api接口let localURL = 'http://localhost/api/elm/'; //这是本地koa2的api接口
axios.defaults.baseURL = httpURL;
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';export default class AxiosCache {
constructor() { this.__config = {} this.__setting = setting; this.init();
}
init() { this.doFlushSetting(CACHE_KEY, )
}
doFlushSetting(key, conf) { if (!key && typeof key !== 'string') { return
} this.__config[key] = conf
} /*判断状态码*/
resultJudge(code) { return code
} /*发送请求数据*/
sendRequest(key, options) { let send = this.__config[this.settingKey][key]; let self = this; let baseURL = send.url;
send.method == 'get'
? options.data && (send.url += options.data)
: send.data = options.data console.log(send.url)
axios(send)
.then(function (response) {
send.url = baseURL; if (self.resultJudge(response.data.status)) {
options.success(response.data.data)
} else {
options.fail
? options.fail(response.data.data)
: self.handleErrorCase(response.data.status)
}
}).catch(function (error) {
self.handleErrorCase(error)
})
} /*处理错误信息*/
handleErrorCase(error) { if (typeof error == 'Number') { console.log(error)
} else {
alert(error)
}
}
}1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465而发送请求的时候,只需要这样
getUSer: function() { this.userCache.getUser({
success: res => this.user = res
})
},12345是不是很简洁。这样做,又进一步的解耦了axios操作,你可以对比我github上的elm1和elm2两个版本结构,一定会有所收获。
前端的架构追求就是尽量 完美复用和解耦
前端第三次重构?
未完待续……
你有好的架构也欢迎你fork我的master版本! ^_^

相关文章
阅读推荐
精选导读

关注我们