記錄vue中一些有意思的坑
'message' handler took 401ms
在出現這個之前,我一直糾結於 是如何使用
vue-router
或者不使用它,通過類似的v-if
來實現。結果卻出現這個問題,嚇得我趕緊使用v-if
,結果問題依舊存在。心里拔涼拔涼的
解決方案
- 在查看別人方案時,才發現是自己為了不使用他人插件,只單純拿其數據,不曾想,數據源過大,導致編譯過程時間過長,把其去掉就好了。然后我的
vue-router
被我都換掉了。不過也無所謂了,路由傳參時,若不想在地址欄中顯示,一刷新傳過來的值都沒有了,不如使用vuex實在。另外組件懶加載,也可以使用,不在意了。不過還是想使用路由,感覺簡介,條例清晰些
vuex 中 actions 異步使用,結合axios數據請求
最近一直在考慮,有沒有必要每次請求都要經過 vuex 的 actions,同時也發現一些痛點,就是有些過程是需要在當前頁面進行請求更好,因為需要及時顯示值,而這些值首次並不能是空,及時之后值請求到,方法無法再次調用,導致值無法及時顯示。只能在當前頁面請求較好,而且這個值只是當前這一個位置使用而已。
加上兄弟組件較多,涉及到不同組件同時請求一個接口,這個適合放在vuex中,因而個人建議,可以確定這個接口請求的數據只有這里使用,且有且僅有當前這個組件進行數據請求,不涉及到其他組件請求時,直接放在當前頁面進行請求即可。 既可以減少vuex的負擔,也可以 減少代碼量,因為為了拿到請求后的數據,需要些許多不必要的代碼。
使用封裝的fetch.js時,考慮更加靈活些
import axios from 'axios'
import { baseUrl } from './../apis/api.js'
import { Loading } from 'element-ui'
axios.defaults.baseURL = baseUrl
axios.defaults.headers = {'Content-Type': 'application/json', 'Accept': 'application/json'}
axios.defaults.timeout = 10000
/**
* get 請求數據進行修改 默認以對象形式傳參
*/
function getDataConfig (data = {}) {
if (typeof data !== 'object') return data
const arr = []
for (let key in data) {
let res = `${key}=${data[key]}`
arr.push(res)
}
const str = arr.join('&')
return str
}
axios.interceptors.request.use(config => {
return config
}, error => {
return Promise.reject(error)
})
axios.interceptors.response.use(response => {
return response.data
}, error => {
return Promise.reject(error)
})
const fetch = {
post (url, request, code = 1000) {
let loadingInstance = Loading.service({'background': 'rgba(0, 0, 0, .6)'})
return new Promise((resolve, reject) => {
axios({
method: 'post',
url,
data: request
}).then(response => {
loadingInstance.close()
const res = response.data
if (res && response.code === code) {
resolve(response)
}
reject(response)
}).catch(error => {
loadingInstance.close()
reject(error)
})
})
},
get (url, request, code = 1000) {
let loadingInstance = Loading.service({'background': 'rgba(0, 0, 0, .6)'})
const data = getDataConfig(request)
return new Promise((resolve, reject) => {
axios({
method: 'get',
url: url + '?' + data
}).then(response => {
loadingInstance.close()
const res = response.data
if (res && response.code === code) {
resolve(response)
}
reject(res)
}).catch(error => {
loadingInstance.close()
reject(error)
})
})
}
}
export default fetch
特別是現在需求實時變化,若是這樣一成不變,很受被動
- 當后台不返回想要的參數時,就會因為封裝不靈活,直接報錯
因為data這個屬性都沒有
- 在使用loading時,要設計靈活,在有些請求地方,loading是另外一種展現形式,有時頁面請求,根本不需要都顯示loading,只是區域性顯示,而這封裝的便會影響體驗
使用vuex時的注意問題
在使用vuex時,老是發現,當前並沒有值,確總是存在上一次保留的值,之前一直很莫名其妙,不得已在看
Vue.js devtools
中查看時,發現上次請求的數據依舊存在,導致下次請求數據時,直接拿里面的值了,這就是為何一進頁面就有值(沒有進行數據請求時),思來想去這個情況會經常存在,考慮若是其他頁面不共用,同時數據也不許額外進行保留時,可以在組件進行銷毀時destroyed
時,再將值初始化即可,這樣可以避免很多不必要的坑