vue(6)—— vue中向後端非同步請求

来源:https://www.cnblogs.com/yangva/archive/2019/03/23/10579239.html
-Advertisement-
Play Games

非同步請求 其實什麼是非同步請求已經不用多說了,通俗的說,就是整個頁面不會刷新,需要更新的部分數據做局部刷新,其他數據不變。 學到這裡,你應該用過jquery里的ajax了,所以很能理解了,不多說了。詳細的就自己百度了 在vue中,可以做非同步請求的有vue-resource和axios ... ...


非同步請求

 

其實什麼是非同步請求已經不用多說了,通俗的說,就是整個頁面不會刷新,需要更新的部分數據做局部刷新,其他數據不變。

學到這裡,你應該用過jquery里的ajax了,所以很能理解了,不多說了。詳細的就自己百度了

 

在vue中,可以做非同步請求的有vue-resource和axios

 

後端項目準備:

 

我用的Python作為後端語言,用的Python的django框架作為後端的web服務,且用的是django-rest-framework做成了前後端分離的項目,本文著重點不在Python後端這方面,感興趣的可以看我的Python相關文章,這裡就不涉及Python的講解,我直接把項目代碼放在這,可以直接用我的服務端項目,前提你得裝了相關的開發環境(Python+django+djangorestframework)

 

項目文件:點我 

 

API介面:

 

 

API介面 支持請求方式 請求參數
http://127.0.0.1/data/ get,post

get:空

post:{'name':XX,'age':xx,'pwd':xx,'brief':xxx}

http://127.0.0.1/retrieve/:id

(id為整形)

put,delete

put:{'name':XX,'age':xx,'pwd':xx,'brief':xxx}

delete: 空

 

資料庫欄位數據:

 

好,接下來就開始做非同步請求了

 

vue-resource

 

vue-resource是vue官方團隊的人開發的,在vue2.0出來之後,開發vue-resource的人表示不再更新,放棄維護,並推薦使用axios,具體原因不深究,總之使用的比較多的還是axios,axios下麵會介紹,這裡還是稍微用下vue-resource怎麼用的

 

安裝

 

同樣的,用npm包安裝:

 

引入包:

 

引入安裝的本地包:

 

引入cdn包:

 

<script src="https://cdn.staticfile.org/vue-resource/1.5.1/vue-resource.min.js"></script>

 

 

使用-get請求

 

這裡就只展示一個get請求了,在axios再展示其他的請求方式,實際開發中估計已經用的不多,瞭解下就行了,我感覺和axios的語法差不了多少。

好的,作為服務端的代碼就是上面的django項目,如果沒有Python的django環境的,也可以自己配置一個後端,反正能正常返回數據就行

 

 

 

正常返回了對吧

 

其實vue-resource的get請求也可以傳入參數的,然後這些都不深究了,還是那句,作為瞭解即可,因為你會發現axios很類似

 

代碼:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title></title>
    <script type="text/javascript" src="./node_modules/vue/dist/vue.js"></script>
    <script type="text/javascript" src="./node_modules/vue-resource/dist/vue-resource.js"></script>
    <style>
    </style>
</head>

<body>
    <div id="app">
        <p>{{msg}}</p>
        <button @click="clickHander" >點我</button>
    </div>
    <script>
        const app = new Vue({
            el: '#app',
            data: {
                msg: ''
            },
            methods: {
                clickHander() {
                    this.$http.get('http://127.0.0.1:8000/data/',)
                    .then(function (data) { //正確的回調
                        this.msg = data
                        console.log(data.data);
                    }, function (data) {   // 錯誤的回調
                        console.log(data)
                    });

                }
            },

        })
    </script>
</body>

</html>
vue-resource

 

 

axios

axios現在非常流行,開玩笑,vue官方都推薦它,用的人肯定多啊,不多說了,詳細自己看官網文檔吧,這裡有個中文版的官網:傳送門

 

安裝

 

導包

 

導入本地包:

 

導入cdn包:

 

<script type="text/javascript" src="https://cdn.bootcss.com/axios/0.19.0-beta.1/axios.js"></script>

 

使用

 

這裡用的後端服務還是上面給的那個django項目

 

get請求

 

可以返回結果。

 

axios的function函數this對象

但是發現在html結構上並沒有把數據渲染出來,按理說,明明已經拿到數據,但是並沒有正常渲染給p標簽,這個是個大眾都容易犯的錯,很多人都卡在這裡,都納悶啊,在進入axios的前後,列印this對象看看:

 

發現問題了,進入axios之後,this對象改變了,變成了根對象了,這個怎麼辦呢

 

1.大眾都能想到的辦法,用一個臨時變數接收:

 

可以用,不過不太推薦這個方法

 

2.利用箭頭函數,永遠綁定this對象

 

 

 

這樣就完事了,我們也不需要去自己定義一個臨時變數存儲,很方便的

 

至於什麼是箭頭函數,這裡不多說,在前端基礎部分內容里會說,大概就說下,箭頭函數的格式

() =>{

}

如果沒有參數的話,括弧可以省略

 

代碼:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title></title>
    <script type="text/javascript" src="./node_modules/vue/dist/vue.js"></script>
    <script type="text/javascript" src="./node_modules/axios/dist/axios.js"></script>
    <style>
    </style>
</head>
<body>
    <div id="app">
        <p>{{msg}}</p>
        <button @click="clickHander" >點我</button>
        
    </div>
    <script>
        const app = new Vue({
            el: '#app',
            data: {
                msg: ''
            },
            methods: {
                clickHander() {
                    console.log(this) // 之前
                    axios.get('http://127.0.0.1:8000/data/')
                    .then((data)=>{ // 正確的回調
                        console.log(this) // 之後
                        console.log(data.data);
                        this.msg = data.data
                    })
                    .catch((error)=>{ // 錯誤的回調
                        console.log(error)
                    })
                }
            },
        })
    </script>
</body>

</html>
axios-get

 

 

get請求也可以傳入參數的

 

此時這裡就不展示了,自行研究了

 

 

post請求

 

 這裡要註意一下,如果是非get方式的傳參,按文檔:

 

需要用URLsearchParams對象把參數作url編碼

 

 

註:

 

URLsearchParams.append()方法接收兩個參數,一個是鍵,一個是值,一次只能傳一對鍵值,所以這裡有點繁瑣

不過我覺得應該有一次性傳入多個參數的方法,這裡不去深究了,這是只是展示案例,感興趣自行研究

 

最後結果,確實添加進來了:

 

代碼:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title></title>
    <script type="text/javascript" src="./node_modules/vue/dist/vue.js"></script>
    <script type="text/javascript" src="./node_modules/axios/dist/axios.js"></script>
    <style>
    </style>
</head>
<body>
    <div id="app">
        <p>{{msg}}</p>
        <button @click="clickHander" >點我</button>
        
    </div>
    <script>
        const app = new Vue({
            el: '#app',
            data: {
                msg: ''
            },
            methods: {
                clickHander() {
                    var params = new URLSearchParams();
                    params.append('age',60)
                    params.append('brief','我什麼簡介要你管')
                    params.append('name','老王')
                    params.append('pwd','123')
                    console.log(params)
                    axios.post('http://127.0.0.1:8000/data/',params)                    
                    .then((data)=>{ // 正確的回調
                        console.log(data.data);
                        this.msg = data.data
                    })
                    .catch((error)=>{ // 錯誤的回調
                        console.log(error)
                    })
                }
            },
        })
    </script>
</body>

</html>
axios-post

 

 

put請求

 

其實axios的post一樣可以完成put、delete等的請求,官方說的是為了方便起見,取了別名:

 

好的,話不多說,直接乾

 

我要修改老王的密碼:

 

修改之前,老王的密碼是123:

 

 

 

修改之後,老王的密碼成了pwd1929...,正好就是我們剛纔改的那個密碼

 

代碼:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title></title>
    <script type="text/javascript" src="./node_modules/vue/dist/vue.js"></script>
    <script type="text/javascript" src="./node_modules/axios/dist/axios.js"></script>
    <style>
    </style>
</head>
<body>
    <div id="app">
        <p>{{msg}}</p>
        <button @click="clickHander" >點我</button>
        
    </div>
    <script>
        const app = new Vue({
            el: '#app',
            data: {
                msg: ''
            },
            methods: {
                clickHander() {
                    var params = new URLSearchParams();
                    params.append('age',60)
                    params.append('brief','我什麼簡介要你管')
                    params.append('name','老王')
                    params.append('pwd','pwd192924')
                    console.log(params)
                    axios.put('http://127.0.0.1:8000/retrieve/6',params)                    
                    .then((data)=>{ // 正確的回調
                        console.log(data.data);
                        this.msg = data.data
                    })
                    .catch((error)=>{ // 錯誤的回調
                        console.log(error)
                    })
                }
            },
        })
    </script>
</body>

</html>
axios-put

 

 

 

delete請求

這個就簡單了,直接上代碼,在之前,資料庫的數據如下,我要刪除id為7的那個數據:

 

開乾:

 

 

 刪除之後的資料庫,確實沒有了:

 

 

代碼:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title></title>
    <script type="text/javascript" src="./node_modules/vue/dist/vue.js"></script>
    <script type="text/javascript" src="./node_modules/axios/dist/axios.js"></script>
    <style>
    </style>
</head>
<body>
    <div id="app">
        <p>{{msg}}</p>
        <button @click="clickHander" >點我</button>
        
    </div>
    <script>
        const app = new Vue({
            el: '#app',
            data: {
                msg: ''
            },
            methods: {
                clickHander() {
                    var params = new URLSearchParams();
                    axios.delete('http://127.0.0.1:8000/retrieve/7')                    
                    .then((data)=>{ // 正確的回調
                        console.log(data.data);
                        this.msg = data.data
                    })
                    .catch((error)=>{ // 錯誤的回調
                        console.log(error)
                    })
                }
            },
        })
    </script>
</body>

</html>
axios-delete

 

axios其他相關配置:

axios可以直接掛載在vue實例的屬性上:

 

Vue.prototype.$axios = axios   // 註意是prototype,不是property
this.$axios.get(....)

 

正常訪問:

 

可以配置預設url

 

在以後大型項目中,如果請求多次,那麼是不是你這代碼每次都要寫url,而且如果url改變的話,每個非同步請求的部分都要改,這樣不利於維護,所以可以配置個預設的url首碼:

 

axios.defaults.baseURL = 'http://127.0.0.1:8000'  // 註意是defaults和baseURL
axios.get('/xxx/')

 

 

 

代碼:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title></title>
    <script type="text/javascript" src="./node_modules/vue/dist/vue.js"></script>
    <script type="text/javascript" src="./node_modules/axios/dist/axios.js"></script>
    <style>
    </style>
</head>
<body>
    <div id="app">
        <p>{{msg}}</p>
        <button @click="clickHander" >點我</button>
        
    </div>
    <script>
        Vue.prototype.$axios = axios;
        axios.defaults.baseURL = 'http://127.0.0.1:8000'
        const app = new Vue({
            el: '#app',
            data: {
                msg: ''
            },
            methods: {
                clickHander() {
                    this.$axios.get('/data/')                    
                    .then((data)=>{ // 正確的回調
                        console.log(data.data);
                        this.msg = data.data
                    })
                    .catch((error)=>{ // 錯誤的回調
                        console.log(error)
                    })
                }
            },
        })
    </script>
</body>

</html>
axios-baseURL-掛載到vue實例屬性上

 

 

總結:

非常簡單,還是那句,多看官方文檔

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Insert,delete,update對btre索引的影響 對需要跟蹤的索引進行監控 Alter index 索引名 monitoring usage; 對需要跟蹤的索引取消監控 Alter index 索引名 nomonitoring usage; 通過觀察v$object_usage進行跟蹤 ...
  • 一、大數據存儲和計算的各種框架即工具 1.存儲:HDFS:分散式文件系統 Hbase:分散式資料庫系統 Kafka:分散式消息緩存系統 2.計算:Mapreduce:離線計算框架 storm:實時流式計算 spark:離線批處理/實時流處理計算框架(MR的二次封裝) 3.輔助類工具:hive:數據倉 ...
  • 一.客戶端與服務端模型 1.mysql是一個典型的c/s服務結構 1.mysql自帶的客戶端程式(/application/mysql/bin) mysql mysqladmin mysqldump 2.市面上大部分的開發語言都需要一個客戶端連接程式連接mysql的服務端 2.mysql是一個守護進 ...
  • 一.Mysql安裝方式 1.安裝方式 1.rpm,yum安裝 安裝方便,安裝速度快,但無法定製 2.二進位安裝 不需要安裝,解壓即用,不能定製功能 3.編譯安裝 可定製,安裝很慢,安裝分為四個步驟 1.1 解壓(tar) 1.2 生成(./configure)或者cmake 1.3 編譯(make) ...
  • 應用程式慢如牛,原因多多,可能是網路的原因、可能是系統架構的原因,還有可能是資料庫的原因。 那麼如何提高資料庫SQL語句執行速度呢?有人會說性能調優是資料庫管理員(DBA)的事,然而性能調優跟程式員們也有莫大的關係 程式中嵌入的一行行的SQL語句,如果使用了一些優化小技巧,定能達到事半功倍的效果... ...
  • Mysql常用命令 啟動 net start mysql 關閉 net stop mysql 連接mysql mysql uroot ppssword mysql uroot P3307 ppssword 修改密碼 mysqladmin uroot p123456 password 123 增加用戶 ...
  • In order to build a complete ffmpeg with hardware acceleration for Intel platform (XXX lake + Atom), we need a complete Android x86 build, the cross-c ...
  • 程式6:用*號輸出字母C的圖案 console.log(' ****'); console.log(' ***'); console.log(' **'); console.log(' *'); console.log('*'); console.log(' *'); console.log(' * ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...