常常在使用vue初始化組件時,會報一些莫名其妙的錯誤,或者,數據明明有數據,確仍是拿不到,這是多麼痛苦而又使人忍不住抓耳撓腮,捶胸頓足啊vue
data() { return { option: { chart: '' //echarts的實例 } } }, //鉤子函數 mounted() { this.chart = echarts.init(this.$refs.charts) // 使用vue提供得ref來獲取dom this.chart.setOption(this.option) // 初始化數據 }, computed: { ...mapState({ option(state) { const state = state.state.option //this.chart.setOption(state) return state } }) }, watch: { this.option(oldVal, newVla) { this.chart.setOption(state) } }
computed
中調用setOption
時,會有兩次顯示,第一次沒有數據,於是會報錯,第二次纔有數據,給人的感受是, computed
比mounted
先執行,並且是執行屢次,於是致使報錯,思來想去,最後在watch
中調用時才得以解決sessionStorage
中獲取,當時這個數據是本地的,於是會現出來,可是要求是後出來,放在watch
中解決,雖然watch
是監聽路由,數據,可是也能夠做爲數據前後展現的重要函數
computed
: 假設用來獲取vuex
中的數據vue-router
computed: { ...mapState({ //假設的值 timeList(state) { return state.timeList } }) }
如果想直接使用
timeList
能夠在template
模板中調用,可是如果沒有使用,須要查看timeList
的值,能夠在watch
中,進行監聽便可。以前一直存在誤區,覺得必須在watch
中進行監聽,才能夠拿到值,如今想一想徹底沒有必要,除非進行業務邏輯處理而已vuex
在上面的問題,提到
computed
會執行兩次,而第一次是沒有數據的,須要額外進行處理。今天用一種簡單的方式便可解決session
computed: { ...mapState({ //假設的值 timeList(state) { const timeList = state.timeList if (timeList.length == 0) return //業務邏輯處理 return state.timeList 空 } }) }
簡單地進行判斷便可,如果空,直接跳出函數echarts
computed
在使用時,必定要注意,函數裏面的變量都會被監聽,只要裏面的某一個值變更,便會將整個函數執行一遍,這樣會有不少坑在裏面,於是考慮如何不在裏面使用watch
只是監聽某一個值,如果監聽的值裏面也有不少變量,也會所有監聽