A Vue.js project
# 安装服务 npm install # 启动服务 npm run dev
├── App.vue ├── api │ ├── doctor.js │ └── fetch.js ├── assets │ └── logo.png ├── components │ └── HelloWorld.vue ├── libs │ └── util.js ├── main.js ├── router │ └── index.js ├── store │ ├── index.js │ ├── modules │ └── mutation-types.js └── views └── doctor
处理数据页面这2大块,把数据和页面分离,在vuex里面作请求数据,页面只须要作调用数据。css
请求接口这块再细分,接口和请求接口分开,我使用了最新的async/await函数作数据请求vue
import fetch from './fetch'; export default { // 获取医生列表 list(params) { return fetch.get('/doctor/list', params) }, // 获取医生详情信息 detail(id) { return fetch.post('/doctor/detail/' + id); }, }
import Util from '../libs/util' import qs from 'qs' import Vue from 'vue' Util.ajax.defaults.headers.common = { 'X-Requested-With': 'XMLHttpRequest' }; Util.ajax.interceptors.request.use(config => { /** * 在这里作loading ... * @type {string} */ // 获取token config.headers.common['Authorization'] = 'Bearer ' + Vue.ls.get("web-token"); return config }, error => { return Promise.reject(error) }); Util.ajax.interceptors.response.use(response => { /** * 在这里作loading 关闭 */ // 若是后端有新的token则从新缓存 let newToken = response.headers['new-token']; if (newToken) { Vue.ls.set("web-token", newToken); } return response; }, error => { let response = error.response; if (response.status == 401) { // 处理401错误 } else if (response.status == 403) { // 处理403错误 } else if (response.status == 412) { // 处理412错误 } else if (response.status == 413) { // 处理413权限不足 } return Promise.reject(response) }); export default { post(url, data) { return Util.ajax({ method: 'post', url: url, data: qs.stringify(data), timeout: 30000, headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' } }) }, get(url, params) { return Util.ajax({ method: 'get', url: url, params, }) }, delete(url, params) { return Util.ajax({ method: 'delete', url: url, params }) }, put(url, data) { return Util.ajax({ method: 'put', url: url, data: qs.stringify(data), timeout: 30000, headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' } }) } }
├── index.js ├── modules │ └── doctor.js └── mutation-types.js import doctor from '../../api/doctor' import * as types from '../mutation-types' const state = { // 医生列表 doctorList: [], // 医生详情信息 doctorDetail: null, }; const mutations = { // 设置医生列表 [types.SET_DOCTOR_LIST](state, data) { state.doctorList = data }, // 设置医生详情信息 [types.SET_DOCTOR_DETAIL](state, data) { state.doctorDetail = data }, }; const actions = { /** * 获取医生顾问列表 * @param state * @param commit * @param params * @returns {Promise<void>} */ async getDoctorList({state, commit}, params) { let ret = await doctor.list(params); commit(types.SET_DOCTOR_LIST, ret.data.data); }, /** * 获取医生详情信息 * @param state * @param commit * @param id 医生ID * @returns {Promise<void>} */ async getDoctorDetail({state, commit}, id) { let ret = await doctor.detail(id); commit(types.SET_DOCTOR_DETAIL, ret.data.data); } }; export default { state, actions, mutations }
import {mapActions, mapState} from 'vuex'
└── doctor ├── detail.vue └── list.vue <script> import {mapActions, mapState} from 'vuex' export default { components: {}, data() { return {} }, computed: { ...mapState({ doctorList: state => state.doctor.doctorList, }) }, async created() { // 医生类型 let params = {type: 'EXP'}; // 获取医生列表 await this.getDoctorList(params); }, methods: { ...mapActions([ // 获取医生列表 'getDoctorList' ]), // 路由跳转方法 routeLink(link) { this.$router.push({path: link}); }, } } </script>