最近在前端開發的過程當中踩了很多坑,先記錄下來,日後整理html
vue.js
裏每一次進行路由導航,對應路由的vue.js
組件都會生成一個新的vue實例(簡稱vm
),不注意這一點話會掉坑。前端
好比在/home
路由裏,在mounted()
中,我在window
下監聽了一個鍵盤事件,爲了不事件重複綁定屢次,我設立一個全局變量來標記建立的狀態,只有第一次進入時才建立監聽事件。vue
if(!window.keyupFlag){ let myFunc = ()=>{console.log(this.$refs.input1)}; //這裏用箭頭函數能直接在函數內拿到指向當前的vm的this window.addEventListener('keyup',myFunc); window.keyupFlag = 1; }
可是這樣會致使一個問題,在我跳轉到別的路由,好比/about
後在跳轉回/home
,我在myFunc
函數中this.$refs.input1
就會返回undefined
。
緣由就是此時/home
路由中的vm
再也不是第一次建立監聽時this
指向的vm
了。ios
那麼轉換思路,改爲每次進入/home
都建立監聽事件,且在建立前先清除以前創立的事件。
以及要注意的是,清除事件的target.removeEventListener(type, listener[, options]);
,其中傳入的參數要和建立時的一致,且type和listener這兩個參數都是必須的,具體的能夠參閱MDN文檔
這裏我選擇用vuex
來保存監聽的回調函數vuex
let myFunc = ()=>{console.log(this.$refs.input1)}; let oldMyFunc = this.$store.state.myFunc; //第一次進入/home時這裏尚未被myFunc賦值,第二次進入路由時就有正確的值了 window.removeEventListener('keyup',oldMyFunc); window.addEventListener('keyup',myFunc); this.$store.commit('setMyFunc',myFunc);
緣由是跨域發起複雜請求時,按照新的標準瀏覽器會先發起一個預檢請求OPTIONS請求來測試請求是否能被服務器接受,若是服務端對此沒有相應的處理,就會出現請求失敗的問題。
具體的方案待施工,先丟幾個參考segmentfault
http://www.ruanyifeng.com/blo...
https://juejin.im/post/5c68b2...
https://segmentfault.com/a/11...跨域
相關的教程不少,可是有兩點鮮有說起瀏覽器
當使用code
來請求access_token
時,發起的請求頭Header中要設置"Authorization": ...,
具體的Authorization值可能不一樣的服務端會有區別,個人項目中用的是服務器
//BASE64編碼字符串"clientId:clientSecret" 'Basic ' + window.btoa(clientId + ':' + clientSecret);