Lau*_*ony 4 javascript laravel vue.js axios vuex
所以我使用 laravel 作为后端,使用 vue js 作为 spa 前端框架来创建 spa Web 应用程序。我正在使用 Laravel Passport 进行 API 身份验证。我正在使用 vuex 来控制我的应用程序状态。
首先我创建一个 api 文件来与 axios 进行交互
import { BKCU_CONFIG } from '../config.js';
export default {
getArtikelS: function( p ){
return axios.get( BKCU_CONFIG.API_URL + '/artikel' + `?column=${p.column}&direction=${p.direction}&per_page=${p.per_page}&page=${p.page}&search_column=${p.search_column}&search_operator=${p.search_operator}&search_query_1=${p.search_query_1}&search_query_2=${p.search_query_2}`);
},
getArtikelCUS: function( p, id ){
return axios.get( BKCU_CONFIG.API_URL + '/artikel/indexCU/' + id + `?column=${p.column}&direction=${p.direction}&per_page=${p.per_page}&page=${p.page}&search_column=${p.search_column}&search_operator=${p.search_operator}&search_query_1=${p.search_query_1}&search_query_2=${p.search_query_2}`);
},
getArtikel: function( id ){
return axios.get(BKCU_CONFIG.API_URL + '/artikel/' + id);
},
createArtikel: function(){
return axios.get(BKCU_CONFIG.API_URL + '/artikel/create');
},
storeArtikel: function ( form ){
return axios.post(BKCU_CONFIG.API_URL + '/artikel/store', form);
},
editArtikel: function( id ){
return axios.get(BKCU_CONFIG.API_URL + '/artikel/edit/' + id);
},
updateArtikel: function ( id, form ){
return axios.post(BKCU_CONFIG.API_URL + '/artikel/update/' + id, form);
},
updateTerbitkan: function( id ){
return axios.post(BKCU_CONFIG.API_URL + '/artikel/updateTerbitkan/' + id);
},
updateUtamakan: function( id ){
return axios.post(BKCU_CONFIG.API_URL + '/artikel/updateUtamakan/' + id);
},
deleteArtikel: function( id ){
return axios.delete(BKCU_CONFIG.API_URL + '/artikel/' + id);
}
}
Run Code Online (Sandbox Code Playgroud)
然后我为每个模型 ex 创建一个 vuex 模块。像这样的文章:
import ArtikelAPI from '../../api/artikel.js';
export const artikel = {
state: {
artikelS: [],
artikelLoadStatS: '',
artikel: {},
artikelLoadStat: '',
artikelUpdate: '',
artikelUpdateStat: '',
artikelRules: [],
artikelOption: [],
},
actions: {
// load all
loadArtikelS( { commit }, p ){
commit('setArtikelLoadStatS', 'loading');
ArtikelAPI.getArtikelS( p )
.then( function( response ){
commit('setArtikelS', response.data.model);
commit('setArtikelLoadStatS', 'success');
})
.catch( error => {
commit('setArtikelS', error.response);
commit('setArtikelLoadStatS', 'fail');
});
},
// load by cu
loadArtikelCUS( { commit }, [p, id] ){
commit('setArtikelLoadStatS', 'loading');
ArtikelAPI.getArtikelCUS( p, id )
.then( function( response ){
commit('setArtikelS', response.data.model);
commit('setArtikelLoadStatS', 'success');
})
.catch( error => {
commit('setArtikelS', error.response);
commit('setArtikelLoadStatS', 'fail');
});
},
// load single data
loadArtikel( {commit}, id ){
commit('setArtikelLoadStat', 'loading');
ArtikelAPI.getArtikel( id )
.then( function( response ){
commit('setArtikel', response.data );
commit('setArtikelLoadStat', 'success');
})
.catch( error => {
commit('setArtikelS', error.response);
commit('setArtikelLoadStatS', 'fail');
});
},
// create page
createArtikel( {commit} ){
commit('setArtikelLoadStat', 'loading');
ArtikelAPI.createArtikel()
.then( function( response ){
commit('setArtikel', response.data.form );
commit('setArtikelRules', response.data.rules);
commit('setArtikelOption', response.data.option)
commit('setArtikelLoadStat', 'success');
})
.catch( function(){
commit('setArtikel', []);
commit('setArtikelRules', []);
commit('setArtikelOption', [])
commit('setArtikelLoadStat', 'fail');
});
},
// store data
storeArtikel( {commit, state, dispatch}, form ){
commit('setArtikelUpdateStat', 'loading');
ArtikelAPI.storeArtikel( form )
.then( function( response ){
if(response.data.saved){
commit('setArtikelUpdate', response.data);
commit('setArtikelUpdateStat', 'success');
}else{
commit('setArtikelUpdateStat', 'fail');
}
})
.catch(error => {
if (error.response.status) {
this.errors = error.response.data;
commit('setArtikelUpdate', this.errors);
}else{
commit('setArtikelUpdate', 'Oops terjadi kesalahan :(');
}
commit('setArtikelUpdateStat', 'fail');
});
},
// edit page
editArtikel( {commit}, id ){
commit('setArtikelLoadStat', 'loading');
ArtikelAPI.editArtikel( id )
.then( function( response ){
commit('setArtikel', response.data.form );
commit('setArtikelRules', response.data.rules);
commit('setArtikelOption', response.data.option)
commit('setArtikelLoadStat', 'success');
})
.catch( function(){
commit('setArtikel', []);
commit('setArtikelRules', []);
commit('setArtikelOption', [])
commit('setArtikelLoadStat', 'fail');
});
},
// update data
updateArtikel( {commit, state, dispatch}, [id, form] ){
commit('setArtikelUpdateStat', 'loading');
ArtikelAPI.updateArtikel( id, form )
.then( function( response ){
if(response.data.saved){
commit('setArtikelUpdate', response.data);
commit('setArtikelUpdateStat', 'success');
}else{
commit('setArtikelUpdateStat', 'fail');
}
})
.catch(error => {
if (error.response.status) {
this.errors = error.response.data;
commit('setArtikelUpdate', this.errors);
}else{
commit('setArtikelUpdate', 'Oops terjadi kesalahan :(');
}
commit('setArtikelUpdateStat', 'fail');
});
},
updateArtikelTerbitkan( {commit, state, dispatch}, id ){
commit('setArtikelUpdateStat', 'loading');
ArtikelAPI.updateTerbitkan( id )
.then( function( response ){
if(response.data.saved){
commit('setArtikelUpdate', response.data);
commit('setArtikelUpdateStat', 'success');
}else{
commit('setArtikelUpdateStat', 'fail');
}
})
.catch(error => {
if (error.response.status) {
this.errors = error.response.data;
commit('setArtikelUpdate', this.errors);
}else{
commit('setArtikelUpdate', 'Oops terjadi kesalahan :(');
}
commit('setArtikelUpdateStat', 'fail');
});
},
updateArtikelUtamakan( {commit, state, dispatch}, id ){
commit('setArtikelUpdateStat', 'loading');
ArtikelAPI.updateUtamakan( id )
.then( function( response ){
if(response.data.saved){
commit('setArtikelUpdate', response.data);
commit('setArtikelUpdateStat', 'success');
}else{
commit('setArtikelUpdateStat', 'fail');
}
})
.catch(error => {
if (error.response.status) {
this.errors = error.response.data;
commit('setArtikelUpdate', this.errors);
}else{
commit('setArtikelUpdate', 'Oops terjadi kesalahan :(');
}
commit('setArtikelUpdateStat', 'fail');
});
},
// delete data
deleteArtikel( {commit, state, dispatch}, id ){
commit('setArtikelUpdateStat', 'loading');
ArtikelAPI.deleteArtikel( id )
.then( function( response ){
if(response.data.saved){
commit('setArtikelUpdate', response.data);
commit('setArtikelUpdateStat', 'success');
}else{
commit('setArtikelUpdateStat', 'fail');
}
})
.catch(error => {
if (error.response.status) {
this.errors = error.response.data;
commit('setArtikelUpdate', this.errors);
}else{
commit('setArtikelUpdate', 'Oops terjadi kesalahan :(');
}
commit('setArtikelUpdateStat', 'fail');
});
},
// reset status
resetArtikelUpdateStat( {commit} ){
commit('setArtikelUpdateStat', '');
}
},
mutations: {
setArtikelS ( state, artikelS ){
state.artikelS = artikelS;
},
setArtikelLoadStatS( state, status ){
state.artikelLoadStatS = status;
},
setArtikel ( state, artikel ){
state.artikel = artikel;
},
setArtikelLoadStat( state, status ){
state.artikelLoadStat = status;
},
setArtikelUpdateStat( state, status ){
state.artikelUpdateStat = status;
},
setArtikelUpdate( state, data ){
state.artikelUpdate = data;
},
setArtikelRules( state, rules ){
state.artikelRules = rules;
},
setArtikelOption( state, option ){
state.artikelOption = option;
}
},
getters: {
getArtikelS( state ){
return state.artikelS;
},
getArtikelLoadStatS ( state ){
return state.artikelLoadStatS;
},
getArtikel( state ){
return state.artikel;
},
getArtikelLoadStat ( state ){
return state.artikelLoadStat;
},
getArtikelUpdateStat ( state ){
return state.artikelUpdateStat;
},
getArtikelUpdate ( state ){
return state.artikelUpdate;
},
getArtikelRules ( state ){
return state.artikelRules;
},
getArtikelOption ( state ){
return state.artikelOption;
}
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我的每个操作都包含一个错误捕获,它仅捕获错误并显示消息。我发现这种处理事情的方式有一些缺点
也许有人可以帮助我改进这种工作流程,一切都工作正常并且非常结构化,但我发现缺少错误捕获,例如:
您可以使用 axios 的一些功能来摆脱这个样板
使用拦截器
axios.interceptors.response.use(response => {
return response.data;
}, error => {
if (error.response && error.response.data) {
// handle your errors here.
handleServerErrors(error.response.data);
}
return Promise.reject(error);
});
Run Code Online (Sandbox Code Playgroud)
使用 axios 默认值
axios.defaults.timeout = 5000;
axios.defaults.baseURL = BKCU_CONFIG.API_URL
Run Code Online (Sandbox Code Playgroud)
不要再连接 url。由于您已经设置了默认网址,因此您可以这样做
getArtikel: function( id ){
return axios.get('/artikel/' + id);
}
Run Code Online (Sandbox Code Playgroud)
使用 ES6 功能和 axios 参数,这样你就可以把它变成
getArtikelS: function( p ){
return axios.get( BKCU_CONFIG.API_URL + '/artikel' + `?column=${p.column}&direction=${p.direction}&per_page=${p.per_page}&page=${p.page}&search_column=${p.search_column}&search_operator=${p.search_operator}&search_query_1=${p.search_query_1}&search_query_2=${p.search_query_2}`);
},
Run Code Online (Sandbox Code Playgroud)
进入像这样更好的东西
getArtikelS(p){
return axios.get(`/artikel`, {params: p})
}
Run Code Online (Sandbox Code Playgroud)
Axios 支持 params 作为对象,因此您不必编写奇怪的查询字符串:)
最后一点提示:不要将所有内容都存储到 vuex 中。如果您不需要在超过 1 个组件中使用该数据,请直接在组件中调用 api。
| 归档时间: |
|
| 查看次数: |
10945 次 |
| 最近记录: |