只有在ajax才能找回一點點主場了,vue中的ajax一天整完,內容還行,主要是對axios的運用。 明天按理說要開始vuex了,這個從來都是只耳聞沒有眼見過,明天來看看看看是個什麼神奇的東西。 一. 解決開發環境ajax跨域問題 1.配置代理(方法一) 首先我們能發起ajax請求的,xhr原生不推 ...
只有在ajax才能找回一點點主場了,vue中的ajax一天整完,內容還行,主要是對axios的運用。
明天按理說要開始vuex了,這個從來都是只耳聞沒有眼見過,明天來看看看看是個什麼神奇的東西。
一. 解決開發環境ajax跨域問題
1.配置代理(方法一)
首先我們能發起ajax請求的,xhr原生不推薦、jQuery也不封裝得有但是也不推薦,因為要操作DOM,然後就是axios,它的體積比jQuery而且他是專門處理數據請求的,他還是promise風格的,jq和axios都是基於xhr來封裝的,如果沒有了xhr他們就沒有了,但是這個fetch是跟xhr同級的也是原生的,不基於xhr,而且也是promise風格的,他的問題是相容性差
開啟兩個本地的node伺服器,通過axios來獲取數據,先下載axios並導入,註意一下,axios的使用,調用get、post以及ajax綜合請求等,還有後面then回調會有返回成功或者失敗的函數
果不其然,當我們點擊直接就跨域了,我們解決跨域一般三種方法,
cors是配置在後端node裡面的,但是它的缺點就是,不能隨便使用響應頭,要配置本公司內容能請求的響應頭,不然用它預設的是個人都可以請求我們伺服器的數據了
然後jsonp就不用說了,雖然可以配置在前端,但是只限於get,局限性太大了
最後還剩下一種,以前沒有學過的-代理,它的原理是這樣的,在前端和伺服器之間來一個中間代理伺服器,保持跟前端一樣的協議埠號等,這樣一來前端從代理伺服器請求發起資源都沒問題了,為什麼代理伺服器和伺服器不一樣卻可以互相拿資源?因為同源策略使我們瀏覽器的策略,伺服器之間沒得這種協議,隨便訪問
我們這裡通過vue-cli來開啟代理伺服器,通過配置vue.config.js也就是前面說過的,vue-cli的配置文件,所以需要在vue-cli官網的配置參考找到 devServer.proxy,直接拿過來配置即可,這裡要註意,這個地址是寫的你要請求的api伺服器地址,而且不用寫具體下麵哪個路徑,寫到埠號就夠了,因為它是自動代理伺服器的埠號為我們vue-cli伺服器的埠號
還有最後一步別忘記改了,在我們axios請求那裡將請求的伺服器改為代理伺服器其實也相當於就是自己的vue-cli這個伺服器,以為他們兩個是一樣的,同時你可以理解為代理伺服器現在有了api伺服器的資源,所以真正要請求的路徑在這裡填寫
但是這個方法有兩個問題
-
一個是我們轉發的伺服器只能設置一個,多個不行
-
一個這個代理伺服器,如果本身伺服器身上有會預設去拿自身伺服器上的,什麼叫做自身伺服器上的,在我們public文件夾下麵的都是8080伺服器埠上掛載的文件
那麼問題來了,我如果自己也有個student的文件
這個時候再去拿就是我們自己伺服器上的這個students的資源了
2.配置代理(方法二)
同樣是參照官網cli的devServer.proxy第二段代碼,他那裡複製過來是這樣的,後面會增刪一些內容
首先/api相當於給你掛首碼了,但是只是拿來繞開vue-cli的本地伺服器的查找機制,我有首碼就不是找你public下麵的東西了,就算你也有students,也不關我的事,然後target就為我們的伺服器地址,下麵ws表示支持websocket,changeOrigin表示控制請求頭中的host值(其實就是要不要撒謊的意思,為fasle,當我們代理伺服器訪問api伺服器,代理伺服器的埠號就為8080,如果為true,那麼他就會跟著api伺服器的埠號走,假裝告訴你我也是5000,以防有些api伺服器開啟限制,必須同埠號的伺服器才能訪問),後面這兩個配置不寫也預設為true,當然這樣還沒完,還有一個關鍵配置,cli官網沒給我們寫出來,要配置一個pathRewrite的屬性,值為一個對象,裡面內容表示把以什麼首碼開頭的這個欄位轉換為空字元串,為什麼要這麼做,因為我剛纔說的,我們添加這個首碼只是為了繞過前端這一塊,解決那個本地伺服器和api伺服器都有相同的資源,會先去找本地伺服器的情況,如果進入api伺服器還去找這麼一個地址,那他下麵根本沒得我們的heymar首碼,所以就會報錯,需要註意的是這裡的正則並不需要字面量來包裹,直接引號包起就可以了
然後記得將我們的axios的請求添加首碼
這個時候就算我們public下麵有同名的文件,也不會訪問到他了
如果我們有多個伺服器,直接接著配置在下麵即可
二.github用戶搜索案例
搜索關鍵字可以把github的用戶名字及頭像顯示出來
組件化編程先拆組件,搜索為一個組件search,下麵列表展示為一個組價list,我們這裡引入了bootstrap.css,引入這些外部的文件有兩種方式,一種是在我們src下麵創建一個文件夾,assets專門來放這些,通過import引入
可以看到用這種方式引入,頁面編譯報錯了,找不到這些字體文件,因為我就單純引入了一個bootstrap.css也用不到這些字體文件,這裡就要說到import的規則了,import導入是嚴格導入,他會去找你這個文件所有的依賴都要準備完畢才會給你編譯成功,所以這裡我們還有第二個方法,在public下麵創建一個css文件夾,然後通過index.html我們link方式來導入,link就不會給你檢查這麼多了,這裡也要尊重他的一個語法規則,前面要添加上一些參數
依照前面的思想,靜態頁面創建完畢,組件劃分好後,第二步應該開始創建動態數據了,在這個案例,input輸入的值是我們的數據,list每一個展示出來的用戶信息是我們的數據,先把input的值搞好,用v-model綁定數據
當我們點擊就去發送請求,通過關鍵字回來的參數再通過全局事件匯流排將數據發給我們的list
我們只要這三個數據,頭像地址,用戶github網址,用戶名字
收到數據通過v-for渲染到頁面
1.完善案例
我們整個案例list界面其實要分為四個界面才完善,搜索出來的用戶列表只是其中一個,還有剛開始進來的歡迎界面,點擊搜索的loading界面,以及失敗後的錯誤界面,很明顯這裡要用條件渲染,寫上四個界面
主要是他們的條件是什麼?結合前面的案例,一般條件渲染要控制幾個頁面的顯示隱藏,至少都得有一個開關也就是變數,來判斷他該顯示還是隱藏,那麼這裡應該有四個開關,來表示四種不同的界面,首先welcome這個界面簡單,一上來就為true,當我們點擊搜索就將loading改為true,直到獲取到請求,將它改為false,將用戶列表的頁面改為true也可以,但為了保險起見最好改為userInfo的長度,要有長度才是真正的得到數據了,錯誤信息這裡一直都是false,知道進入錯誤的回調才為true
由於我們要一點擊就將wel改為false,將loading改為true,所以需要將數據傳到search這個界面,一旦點擊就會觸發這個自定義時間,會發送過來一個對象數據
list接受這邊,為了能夠直接賦值最好也將剛纔定義的數據都裝到一個對象裡面去,接收到search傳過來的對象就可以直接賦值,這樣的好處不僅是方便,而且傳過來的數據也語義化一點,不然就只能是傳過來true,false等,我這邊讓每一個值等於這些值
一直到我們獲取到數據,又傳過來一個新的對象,重新賦值新的對象
這裡有一個小註意點:因為我們的wel界面是一刷新就有,後面不可能再出現了,所以後面傳過來的數據都不帶wel這個參數的,你又以對象賦的值,所以只會導致一種情況
結構被改了,這裡可以用到,es6的擴展運算符,主要是把這個要用起來,用處還是蠻多的
三.vue 項目中常用的 2 個 Ajax 庫
1.axios
2.vue-resource(瞭解)
是比較老的一個ajax請求庫,除了xhr、jq、axios、fetch後有多出了一個,它是vue的一個 插件庫,所以說要在入口文件導入並註冊
前面也說過,只要插件一註冊,那麼下麵的vm、vc都可以使用了,使用$http即可,使用方法跟axios一模一樣,就連返回值都一樣,也是promise風格
四.slot插槽
可以讓父組件向子組件指定位置插入html結構
1.無插槽
要完成這樣一個界面,是不是得把其中一個拿來作為組件後面的直接復用即可
這裡傳值有一個註意點,因為我們每個組件標簽都是一個組件收到的數據也是不一樣的,所以可以取一樣的名字,到時候遍歷出來各是各的
props接收數據,渲染即可
2.預設插槽
現在更新需求,我們有兩個廣告商美食這邊只放他的圖片,電影這邊只放他的電影
這個時候就要用到插槽了,以前從沒有在組件標簽裡面寫過標簽體吧,插槽就是要在這裡面寫
先不要管其他的,如果在組建標簽裡面寫了標簽體,還需要一個關鍵步驟,因為vue能夠解析你的標簽,但是他不知道放在哪裡,也就是放在list這個組件的哪裡,所以需要我們在組件模板裡面用一個標簽 slot來占位
這就是我們的slot插槽,但是由於組件裡面的內容改動,後面也不能直接傳數據進去了,也要把對應的位置內容提到組件標簽這裡來寫
註意當我們slot部分沒有內容傳進來的時候,slot標簽裡面的內容就是預設值
3.具名插槽
就是具有名字的插槽,我們上面是一個插槽,可能不需要名字,但是如果有多個插槽,要插往不同的地方呢
首先給slot添加name屬性
然後在我們標簽體這邊,誰要往哪個插槽添加信息,就把他的 slot屬性寫為誰
註意
當我想把一大段代碼加入到一個slot插槽,但是我又不能一個一個去寫,就有點耗時間了,可以將他們都包在一個div裡面然後給div洗衣歌slot,但是這樣就影響頁面佈局了,我們也可以寫一個template標簽包在這裡面就不會影響佈局了
如果用到了template,那麼vue2.6很新的的一個更新,template可以這樣來寫slot名字,鍵值對,而且沒有引號
這個寫法只能應用於template標簽
4.作用域插槽
什麼時候要用到這個作用域插槽
數據在組件的自身,但根據數據生成的數據結構需要組建的使用者來決定
就是數據沒有在我們的插槽的使用者這裡,什麼叫做插槽的使用者,就是我們slot不是等著標簽來填充嗎,誰來填充這個插槽誰就是使用者,就比如說上面這個案例,這個template就是插槽的使用者
我把數據轉移到list裡面去,那麼app裡面定義的這些games,這些list標簽也就是插槽的使用者都用不到數據了,數據轉移到list裡面去了,現在的情況就很像作用域發生了變化,list這個作用域裡面可以使用games,但是插槽使用者在app裡面就用不到,這個時候就要用到作用域插槽了
怎麼來用,首先要知道一句話,插槽的動態綁定,是把這個數據送到他的使用者,註意是使用者,並不是平時這樣是送到下級
我們使用者這邊怎麼來接受這個參數呢?必須使用template標簽,並且裡面寫一個屬性scope沒有d,他的值隨便取,就是一個對象,這裡麵包含了slot傳過來的所有數據,如果就傳過來了一個data那就是值.data就可以取到
------------恢復內容開始------------
只有在ajax才能找回一點點主場了,vue中的ajax一天整完,內容還行,主要是對axios的運用。
明天按理說要開始vuex了,這個從來都是只耳聞沒有眼見過,明天來看看看看是個什麼神奇的東西。
一. 解決開發環境ajax跨域問題
1.配置代理(方法一)
首先我們能發起ajax請求的,xhr原生不推薦、jQuery也不封裝得有但是也不推薦,因為要操作DOM,然後就是axios,它的體積比jQuery而且他是專門處理數據請求的,他還是promise風格的,jq和axios都是基於xhr來封裝的,如果沒有了xhr他們就沒有了,但是這個fetch是跟xhr同級的也是原生的,不基於xhr,而且也是promise風格的,他的問題是相容性差
開啟兩個本地的node伺服器,通過axios來獲取數據,先下載axios並導入,註意一下,axios的使用,調用get、post以及ajax綜合請求等,還有後面then回調會有返回成功或者失敗的函數
果不其然,當我們點擊直接就跨域了,我們解決跨域一般三種方法,
cors是配置在後端node裡面的,但是它的缺點就是,不能隨便使用響應頭,要配置本公司內容能請求的響應頭,不然用它預設的是個人都可以請求我們伺服器的數據了
然後jsonp就不用說了,雖然可以配置在前端,但是只限於get,局限性太大了
最後還剩下一種,以前沒有學過的-代理,它的原理是這樣的,在前端和伺服器之間來一個中間代理伺服器,保持跟前端一樣的協議埠號等,這樣一來前端從代理伺服器請求發起資源都沒問題了,為什麼代理伺服器和伺服器不一樣卻可以互相拿資源?因為同源策略使我們瀏覽器的策略,伺服器之間沒得這種協議,隨便訪問
我們這裡通過vue-cli來開啟代理伺服器,通過配置vue.config.js也就是前面說過的,vue-cli的配置文件,所以需要在vue-cli官網的配置參考找到 devServer.proxy,直接拿過來配置即可,這裡要註意,這個地址是寫的你要請求的api伺服器地址,而且不用寫具體下麵哪個路徑,寫到埠號就夠了,因為它是自動代理伺服器的埠號為我們vue-cli伺服器的埠號
還有最後一步別忘記改了,在我們axios請求那裡將請求的伺服器改為代理伺服器其實也相當於就是自己的vue-cli這個伺服器,以為他們兩個是一樣的,同時你可以理解為代理伺服器現在有了api伺服器的資源,所以真正要請求的路徑在這裡填寫
但是這個方法有兩個問題
-
一個是我們轉發的伺服器只能設置一個,多個不行
-
一個這個代理伺服器,如果本身伺服器身上有會預設去拿自身伺服器上的,什麼叫做自身伺服器上的,在我們public文件夾下麵的都是8080伺服器埠上掛載的文件
那麼問題來了,我如果自己也有個student的文件
這個時候再去拿就是我們自己伺服器上的這個students的資源了
2.配置代理(方法二)
同樣是參照官網cli的devServer.proxy第二段代碼,他那裡複製過來是這樣的,後面會增刪一些內容
首先/api相當於給你掛首碼了,但是只是拿來繞開vue-cli的本地伺服器的查找機制,我有首碼就不是找你public下麵的東西了,就算你也有students,也不關我的事,然後target就為我們的伺服器地址,下麵ws表示支持websocket,changeOrigin表示控制請求頭中的host值(其實就是要不要撒謊的意思,為fasle,當我們代理伺服器訪問api伺服器,代理伺服器的埠號就為8080,如果為true,那麼他就會跟著api伺服器的埠號走,假裝告訴你我也是5000,以防有些api伺服器開啟限制,必須同埠號的伺服器才能訪問),後面這兩個配置不寫也預設為true,當然這樣還沒完,還有一個關鍵配置,cli官網沒給我們寫出來,要配置一個pathRewrite的屬性,值為一個對象,裡面內容表示把以什麼首碼開頭的這個欄位轉換為空字元串,為什麼要這麼做,因為我剛纔說的,我們添加這個首碼只是為了繞過前端這一塊,解決那個本地伺服器和api伺服器都有相同的資源,會先去找本地伺服器的情況,如果進入api伺服器還去找這麼一個地址,那他下麵根本沒得我們的heymar首碼,所以就會報錯,需要註意的是這裡的正則並不需要字面量來包裹,直接引號包起就可以了
然後記得將我們的axios的請求添加首碼
這個時候就算我們public下麵有同名的文件,也不會訪問到他了
如果我們有多個伺服器,直接接著配置在下麵即可
二.github用戶搜索案例
搜索關鍵字可以把github的用戶名字及頭像顯示出來
組件化編程先拆組件,搜索為一個組件search,下麵列表展示為一個組價list,我們這裡引入了bootstrap.css,引入這些外部的文件有兩種方式,一種是在我們src下麵創建一個文件夾,assets專門來放這些,通過import引入
可以看到用這種方式引入,頁面編譯報錯了,找不到這些字體文件,因為我就單純引入了一個bootstrap.css也用不到這些字體文件,這裡就要說到import的規則了,import導入是嚴格導入,他會去找你這個文件所有的依賴都要準備完畢才會給你編譯成功,所以這裡我們還有第二個方法,在public下麵創建一個css文件夾,然後通過index.html我們link方式來導入,link就不會給你檢查這麼多了,這裡也要尊重他的一個語法規則,前面要添加上一些參數
依照前面的思想,靜態頁面創建完畢,組件劃分好後,第二步應該開始創建動態數據了,在這個案例,input輸入的值是我們的數據,list每一個展示出來的用戶信息是我們的數據,先把input的值搞好,用v-model綁定數據
當我們點擊就去發送請求,通過關鍵字回來的參數再通過全局事件匯流排將數據發給我們的list
我們只要這三個數據,頭像地址,用戶github網址,用戶名字
收到數據通過v-for渲染到頁面
1.完善案例
我們整個案例list界面其實要分為四個界面才完善,搜索出來的用戶列表只是其中一個,還有剛開始進來的歡迎界面,點擊搜索的loading界面,以及失敗後的錯誤界面,很明顯這裡要用條件渲染,寫上四個界面
主要是他們的條件是什麼?結合前面的案例,一般條件渲染要控制幾個頁面的顯示隱藏,至少都得有一個開關也就是變數,來判斷他該顯示還是隱藏,那麼這裡應該有四個開關,來表示四種不同的界面,首先welcome這個界面簡單,一上來就為true,當我們點擊搜索就將loading改為true,直到獲取到請求,將它改為false,將用戶列表的頁面改為true也可以,但為了保險起見最好改為userInfo的長度,要有長度才是真正的得到數據了,錯誤信息這裡一直都是false,知道進入錯誤的回調才為true
由於我們要一點擊就將wel改為false,將loading改為true,所以需要將數據傳到search這個界面,一旦點擊就會觸發這個自定義時間,會發送過來一個對象數據
list接受這邊,為了能夠直接賦值最好也將剛纔定義的數據都裝到一個對象裡面去,接收到search傳過來的對象就可以直接賦值,這樣的好處不僅是方便,而且傳過來的數據也語義化一點,不然就只能是傳過來true,false等,我這邊讓每一個值等於這些值
一直到我們獲取到數據,又傳過來一個新的對象,重新賦值新的對象
這裡有一個小註意點:因為我們的wel界面是一刷新就有,後面不可能再出現了,所以後面傳過來的數據都不帶wel這個參數的,你又以對象賦的值,所以只會導致一種情況
結構被改了,這裡可以用到,es6的擴展運算符,主要是把這個要用起來,用處還是蠻多的
三.vue 項目中常用的 2 個 Ajax 庫
1.axios
2.vue-resource(瞭解)
是比較老的一個ajax請求庫,除了xhr、jq、axios、fetch後有多出了一個,它是vue的一個 插件庫,所以說要在入口文件導入並註冊
前面也說過,只要插件一註冊,那麼下麵的vm、vc都可以使用了,使用$http即可,使用方法跟axios一模一樣,就連返回值都一樣,也是promise風格
四.slot插槽
可以讓父組件向子組件指定位置插入html結構
1.無插槽
要完成這樣一個界面,是不是得把其中一個拿來作為組件後面的直接復用即可
這裡傳值有一個註意點,因為我們每個組件標簽都是一個組件收到的數據也是不一樣的,所以可以取一樣的名字,到時候遍歷出來各是各的
props接收數據,渲染即可
2.預設插槽
現在更新需求,我們有兩個廣告商美食這邊只放他的圖片,電影這邊只放他的電影
這個時候就要用到插槽了,以前從沒有在組件標簽裡面寫過標簽體吧,插槽就是要在這裡面寫
先不要管其他的,如果在組建標簽裡面寫了標簽體,還需要一個關鍵步驟,因為vue能夠解析你的標簽,但是他不知道放在哪裡,也就是放在list這個組件的哪裡,所以需要我們在組件模板裡面用一個標簽 slot來占位
這就是我們的slot插槽,但是由於組件裡面的內容改動,後面也不能直接傳數據進去了,也要把對應的位置內容提到組件標簽這裡來寫
註意當我們slot部分沒有內容傳進來的時候,slot標簽裡面的內容就是預設值
3.具名插槽
就是具有名字的插槽,我們上面是一個插槽,可能不需要名字,但是如果有多個插槽,要插往不同的地方呢
首先給slot添加name屬性
然後在我們標簽體這邊,誰要往哪個插槽添加信息,就把他的 slot屬性寫為誰
註意
當我想把一大段代碼加入到一個slot插槽,但是我又不能一個一個去寫,就有點耗時間了,可以將他們都包在一個div裡面然後給div洗衣歌slot,但是這樣就影響頁面佈局了,我們也可以寫一個template標簽包在這裡面就不會影響佈局了
如果用到了template,那麼vue2.6很新的的一個更新,template可以這樣來寫slot名字,鍵值對,而且沒有引號
這個寫法只能應用於template標簽
4.作用域插槽
什麼時候要用到這個作用域插槽
數據在組件的自身,但根據數據生成的數據結構需要組建的使用者來決定
就是數據沒有在我們的插槽的使用者這裡,什麼叫做插槽的使用者,就是我們slot不是等著標簽來填充嗎,誰來填充這個插槽誰就是使用者,就比如說上面這個案例,這個template就是插槽的使用者
我把數據轉移到list裡面去,那麼app裡面定義的這些games,這些list標簽也就是插槽的使用者都用不到數據了,數據轉移到list裡面去了,現在的情況就很像作用域發生了變化,list這個作用域裡面可以使用games,但是插槽使用者在app裡面就用不到,這個時候就要用到作用域插槽了
怎麼來用,首先要知道一句話,插槽的動態綁定,是把這個數據送到他的使用者,註意是使用者,並不是平時這樣是送到下級
我們使用者這邊怎麼來接受這個參數呢?必須使用template標簽,並且裡面寫一個屬性scope沒有d,他的值隨便取,就是一個對象,這裡麵包含了slot傳過來的所有數據,如果就傳過來了一個data那就是值.data就可以取到
------------恢復內容結束------------