AJAX 學習筆記(Day3)

「寫在前面」

本文為黑馬程序員 AJAX 教程的學習筆記。本著自己學習、分享他人的態度,分享學習筆記,希望能對大家有所幫助。推薦先按順序閱讀往期內容:
1. AJAX 學習筆記(Day1)


目錄

  • 3 AJAX 原理
    • 3.1 XMLHttpRequest
    • 3.2 Promise
    • 3.3 封裝簡易版 axios
    • 3.4 案例 - 天氣預報

3 AJAX 原理

3.1 XMLHttpRequest

P33:https://www.bilibili.com/video/BV1MN411y7pw?p=33

什么是 XMLHttpRequest:

alt

關系:axios 內部采用 XMLHttpRequest 與服務器交互

alt

使用 XMLHttpRequest 步驟:

  1. 創建 XMLHttpRequest 對象
  2. 配置請求方法和請求 url 地址
  3. 監聽 loadend 事件,接收響應結果
  4. 發起請求
alt

XMLHttpRequest - 查詢參數

P34:https://www.bilibili.com/video/BV1MN411y7pw?p=34

定義:瀏覽器提供給服務器的額外信息,讓服務器返回瀏覽器想要的數據

語法:http://xxxx.com/xxx/xxx?參數名1=值1&參數名2=值2

案例:使用XHR攜帶查詢參數,展示某個省下屬的城市列表

const xhr = new XMLHttpRequest()
xhr.open('GET', 'http://hmajax.itheima.net/api/city?pname=遼寧省')
xhr.addEventListener('loadend', () => {
console.log(xhr.response)
const data = JSON.parse(xhr.response)
console.log(data)
document.querySelector('.city-p').innerHTML = data.list.join('<br>')
})
xhr.send()

案例:地區查詢

P35:https://www.bilibili.com/video/BV1MN411y7pw?p=35

alt

XMLHttpRequest - 數據提交

P36:https://www.bilibili.com/video/BV1MN411y7pw?p=36

步驟和語法:

  1. 沒有 axios 了,我們需要自己設置請求頭 Content-Type:application/json,來告訴服務器端,我們發過去的內容類型是 JSON 字符串,讓他轉成對應數據結構取值使用
  2. 沒有 axios 了,我們前端要傳遞的請求體數據,也沒人幫我把 JS 對象轉成 JSON 字符串了,需要我們自己轉換
  3. 原生 XHR 需要在 send 方法調用時,傳入請求體攜帶
const xhr = new XMLHttpRequest()
xhr.open('請求方法', '請求url網址')
xhr.addEventListener('loadend', () => {
console.log(xhr.response)
})

// 1. 告訴服務器,我傳遞的內容類型,是 JSON 字符串
xhr.setRequestHeader('Content-Type', 'application/json')
// 2. 準備數據并轉成 JSON 字符串
const user = { username: 'itheima007', password: '7654321' }
const userStr = JSON.stringify(user)
// 3. 發送請求體數據
xhr.send(userStr)

3.2 Promise

P37:https://www.bilibili.com/video/BV1MN411y7pw?p=37

什么是 Promise ?

Promise 對象用于表示一個異步操作的最終完成(或失敗)及其結構值

Promise 的好處?

  • 邏輯更清晰(成功或失敗會關聯后續的處理函數)
  • 了解 axios 函數內部運作的機制
  • 能解決回調函數地獄問題
alt

語法:

// 1. 創建 Promise 對象
const p = new Promise((resolve, reject) => {
// 2. 執行異步任務-并傳遞結果
// 成功調用: resolve(值) 觸發 then() 執行
// 失敗調用: reject(值) 觸發 catch() 執行
})
// 3. 接收結果
p.then(result => {
// 成功
}).catch(error => {
// 失敗
})

Promise - 三種狀態

P38:https://www.bilibili.com/video/BV1MN411y7pw?p=38

一個Promise對象,必然處于以下幾種狀態之一:

  1. 待定(pending):初始狀態,既沒有被兌現,也沒有被拒絕
  2. 已兌現(fulfilled):操作成功完成
  3. 已拒絕(rejected):操作失敗

注意:Promise對象一旦被兌現/拒絕就是已敲定了,狀態無法再被改變

alt

案例:使用Promise + XHR 獲取省份列表

P39:https://www.bilibili.com/video/BV1MN411y7pw?p=39

alt

3.3 封裝簡易版 axios

封裝_簡易axios_獲取省份列表

P40:https://www.bilibili.com/video/BV1MN411y7pw?p=40

需求:基于 Promise + XHR 封裝 myAxios 函數,獲取省份列表展示

/**
* 目標:封裝_簡易axios函數_獲取省份列表
* 1. 定義myAxios函數,接收配置對象,返回Promise對象
* 2. 發起XHR請求,默認請求方法為GET
* 3. 調用成功/失敗的處理程序
* 4. 使用myAxios函數,獲取省份列表展示
*/

// 1. 定義myAxios函數,接收配置對象,返回Promise對象
function myAxios(config) {
return new Promise((resolve, reject) => {
// 2. 發起XHR請求,默認請求方法為GET
const xhr = new XMLHttpRequest()
xhr.open(config.method || 'GET', config.url)
xhr.addEventListener('loadend', () => {
// 3. 調用成功/失敗的處理程序
if (xhr.status >= 200 && xhr.status < 300) {
resolve(JSON.parse(xhr.response))
} else {
reject(new Error(xhr.response))
}
})
xhr.send()
})
}

// 4. 使用myAxios函數,獲取省份列表展示
myAxios({
url: 'http://hmajax.itheima.net/api/province'
}).then(result => {
console.log(result)
document.querySelector('.my-p').innerHTML = result.list.join('<br>')
}).catch(error => {
console.log(error)
document.querySelector('.my-p').innerHTML = error.message
})

封裝_簡易axios_獲取地區列表

P41:https://www.bilibili.com/video/BV1MN411y7pw?p=41

需求:修改 myAxios 函數支持傳遞查詢參數,獲取"遼寧省","大連市"對應地區列表展示

function myAxios(config) {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest()
// 1. 判斷有params選項,攜帶查詢參數
if (config.params) {
// 2. 使用URLSearchParams轉換,并攜帶到url上
const paramsObj = new URLSearchParams(config.params)
const queryString = paramsObj.toString()
// 把查詢參數字符串,拼接在url?后面
config.url += `?${queryString}`
}

xhr.open(config.method || 'GET', config.url)
xhr.addEventListener('loadend', () => {
if (xhr.status >= 200 && xhr.status < 300) {
resolve(JSON.parse(xhr.response))
} else {
reject(new Error(xhr.response))
}
})
xhr.send()
})
}

// 3. 使用myAxios函數,獲取地區列表
myAxios({
url: 'http://hmajax.itheima.net/api/area',
params: {
pname: '遼寧省',
cname: '大連市'
}
}).then(result => {
console.log(result)
document.querySelector('.my-p').innerHTML = result.list.join('<br>')
})

封裝_簡易axios_注冊用戶

P42:https://www.bilibili.com/video/BV1MN411y7pw?p=42

需求:修改 myAxios 函數支持傳遞請求體數據,完成注冊用戶功能

function myAxios(config) {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest()

if (config.params) {
const paramsObj = new URLSearchParams(config.params)
const queryString = paramsObj.toString()
config.url += `?${queryString}`
}
xhr.open(config.method || 'GET', config.url)

xhr.addEventListener('loadend', () => {
if (xhr.status >= 200 && xhr.status < 300) {
resolve(JSON.parse(xhr.response))
} else {
reject(new Error(xhr.response))
}
})
// 1. 判斷有data選項,攜帶請求體
if (config.data) {
// 2. 轉換數據類型,在send中發送
const jsonStr = JSON.stringify(config.data)
xhr.setRequestHeader('Content-Type', 'application/json')
xhr.send(jsonStr)
} else {
// 如果沒有請求體數據,正常的發起請求
xhr.send()
}
})
}

document.querySelector('.reg-btn').addEventListener('click', () => {
// 3. 使用myAxios函數,完成注冊用戶
myAxios({
url: 'http://hmajax.itheima.net/api/register',
method: 'POST',
data: {
username: 'itheima999',
password: '666666'
}
}).then(result => {
console.log(result)
}).catch(error => {
console.dir(error)
})
})

3.4 案例 - 天氣預報

alt

P43:https://www.bilibili.com/video/BV1MN411y7pw?p=43

P44:https://www.bilibili.com/video/BV1MN411y7pw?p=44

P45:https://www.bilibili.com/video/BV1MN411y7pw?p=45

P46:https://www.bilibili.com/video/BV1MN411y7pw?p=46


「結束」
alt

本文由 mdnice 多平臺發布

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/716735.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/716735.shtml
英文地址,請注明出處:http://en.pswp.cn/news/716735.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

springboot心靈治愈交流平臺源碼和論文

本論文主要論述了如何使用JAVA語言開發一個心靈治愈交流平臺 &#xff0c;本系統將嚴格按照軟件開發流程進行各個階段的工作&#xff0c;采用B/S架構&#xff0c;面向對象編程思想進行項目開發。在引言中&#xff0c;作者將論述心靈治愈交流平臺的當前背景以及系統開發的目的&a…

@Transactional--開啟事物后換源報錯

一、問題出現的場景 系統架構設計、每個企業一個企業庫、通過數據源切在平臺庫、和企業庫之間動態切換完成業務操作。 二、跨庫事物失效的原因 1、SpringTransactional不支持跨數據源事物&#xff0c;Spring 事物控制是基于數據庫鏈接進行的&#xff0c;當數據源切換后&#x…

SQL中把datetime 轉為字符串

在 SQL 中&#xff0c;將 datetime 類型的數據轉換為字符串可以使用不同的方法&#xff0c;具體取決于你使用的數據庫系統。以下是一些常見數據庫系統中將 datetime 轉換為字符串的示例&#xff1a; 1. MySQL 在 MySQL 中&#xff0c;你可以使用 DATE_FORMAT() 函數將 dateti…

SketchUp Pro 2023:顛覆傳統,重塑設計世界mac/win版

SketchUp Pro 2023是一款強大的三維建模軟件&#xff0c;專為設計師、建筑師和創意專業人士打造。這款軟件以其直觀易用的界面和強大的功能而著稱&#xff0c;為用戶提供了無限的創意空間。 SketchUp Pro 2023軟件獲取 SketchUp Pro 2023在用戶體驗方面進行了全面的優化&#…

SpringBoot整合rabbitmq-重復消費問題

說明&#xff1a;重復消費的原因大致是生產者將信息A發送到隊列中&#xff0c;消費者監聽到消息A后開始處理業務&#xff0c;業務處理完成后&#xff0c;監聽在告知rabbitmq消息A已經被消費完成途中中斷&#xff0c;也就時說我已經處理完業務&#xff0c;而隊列中還存在當前消息…

Qt|QTreewidget類下函數qt助手詳解說明示例(上)

該系列持續更新&#xff0c;喜歡請一鍵三連&#xff0c;感謝各位大佬。 QT5.14.2 參考官方QT助手 文章目錄 QTreeWidget ClasspropertiesPublic Functions默認構造函數默認析構函數添加根節點void addTopLevelItem(QTreeWidgetItem *item)添加多個根節點void addTopLevelItems…

LeetCode---【和的操作】

目錄 兩數之和我的答案在b站up那里學到的【然后自己復寫】 和為 K 的子數組在b站up那里學到的【然后自己復寫】 三數之和在b站up那里學到的【然后自己復寫】 兩數相加【鏈表】我的半路答案&#xff1a;沒有看到是鏈表在b站up那里學到的【復寫失敗后整理】 兩數之和 我的答案 …

Linux下的權限

1. 操作系統的外殼 在理解Linux權限之前&#xff0c;我們先來吃點小菜。 1.大部分指令都是文件&#xff0c;如果把指令對應的文件刪除了&#xff0c;那么這條指令就使用不了了。 2.用戶執行某種功能的時候&#xff0c;不是直接讓操作系統執行對應的指令的&#xff0c;而是先交…

IIC協議總結

1.基本理解 iic通信協議:雙線制串行通信協議,由時鐘線SCL和數據線SDA構成. 通信方式:主從模式,主設備發起通信,從設備響應通信 2.通信的基本步驟 a.主設備發送一個開始信號&#xff0c;表示開始通信&#xff0c;即啟動I2C 條件&#xff1a;SCL1&#xff0c;SDA出現下降沿 …

Python開源項目月排行 2024年2月

Python 趨勢月報&#xff0c;按月瀏覽往期 GitHub,Gitee 等最熱門的Python開源項目&#xff0c;入選的項目主要參考GitHub Trending,部分參考了Gitee和其他。排名不分先后&#xff0c;都是當前月份內相對熱門的項目。 入選公式&#xff1d;70%GitHub Trending20%Gitee10%其他 …

jvm面試題-背誦版

按照思維導圖抽查和記憶&#xff0c;答案見&#xff1a;四、面試-多線程/并發_scheduledfuture釋放-CSDN博客

Jmeter系列(4) 線程屬性詳解

線程屬性 線程組是配置壓測策略的一個重要環節線程組決定了測試執行的請求數量 線程數 在這里線程數相當于一個虛擬用戶每個線程數大約占內存1M特別注意?? 單臺機器最大線程數不要超過1000&#xff0c;不然可能會造成內存溢出 Ramp-Up時間 所有線程在多長時間內全部啟動…

【網絡工程設計】用GNS3和VMware搭建網絡環境

&#x1f4dd;本文介紹 本文主要是使用GNS3和VMware來搭建網絡環境 &#x1f44b;作者簡介&#xff1a;一個正在積極探索的本科生 &#x1f4f1;聯系方式&#xff1a;943641266(QQ) &#x1f6aa;Github地址&#xff1a;https://github.com/sankexilianhua &#x1f511;Gitee地…

計算機網絡-第2章 物理層

本章內容&#xff1a;物理層和數據通信的概念、傳輸媒體特點&#xff08;不屬于物理層&#xff09;、信道復用、數字傳輸系統、寬帶接入 2.1-2.2 物理層和數據通信的概念 物理層解決的問題&#xff1a;如何在傳輸媒體上傳輸數據比特流&#xff0c;屏蔽掉傳輸媒體和通信手段的差…

文獻閱讀筆記《Spatial-temporal Forecasting for Regions without Observations》13頁

目錄 目錄 目錄 發行刊物 ABSTRACT 1 INTRODUCTION 2 RELATED WORK&#xff08;相關工作 2.1 Spatial-temporal Forecasting&#xff08;時空預測 2.2 Spatial-temporal Forecasting withIncomplete Data&#xff08;不完全數據的時空預測 2.3 Graph Contrastive Lear…

藍橋杯集訓·每日一題2024 (前綴和)

筆記&#xff1a; 例題&#xff1a; #include<bits/stdc.h> using namespace std; const int N 5000010; char str[N]; int s[N]; int main(){int t;cin>>t;for(int a1;a<t;a){int n;cin>>n;scanf("%s",str1);for(int i1;i<n;i){s[i]s[i-1]…

【MySQL】:約束全解析

&#x1f3a5; 嶼小夏 &#xff1a; 個人主頁 &#x1f525;個人專欄 &#xff1a; MySQL從入門到進階 &#x1f304; 莫道桑榆晚&#xff0c;為霞尚滿天&#xff01; 文章目錄 &#x1f4d1;前言一. 約束概述二. 約束演示三. 外鍵約束3.1 介紹3.2 語法3.3 刪除/更新行為 &…

Mybatis - generator(自動生成)

1、生成數據庫數據 2、配置pom文件 這個plugin文件里有配置項和依賴以及版本號 修改configurationFile路徑為項目里存在的generatorConfig.xml文件&#xff0c;因為后續的配置都在這個文件中進行。 <plugin><groupId>org.mybatis.generator</groupId><…

Netty的InboundHandler 和OutboundHandler

一、InboundHandler 和OutboundHandler的區別 在Netty中&#xff0c;"inbound"表示來自外部來源&#xff08;如網絡連接&#xff09;的數據&#xff0c;而"outbound"則表示從應用程序發送到外部目標&#xff08;如網絡連接或其他服務&#xff09;的數據。…

Git——Upload your open store

0.default config ssh-keygen -t rsa #之后一路回車,當前目錄.ssh/下產生公私鑰 cat ~/.ssh/id_rsa.pub #復制公鑰到賬號 git config --global user.email account_email git config --global user.name account_name1. 上傳一個公開倉庫 查看當前分支&#xff1a; git branc…