使用websocket和Vue2中的props實(shí)時(shí)更新數(shù)據(jù)方式
web的概念和使用
WebSocket 是一種在客戶(hù)端和服務(wù)器之間提供長(zhǎng)壽命、雙向通信的協(xié)議。
它不同于傳統(tǒng)的HTTP協(xié)議,HTTP協(xié)議主要用于從客戶(hù)端向服務(wù)器請(qǐng)求資源,而WebSocket則為應(yīng)用程序提供了全雙工(full-duplex)的通信渠道,允許服務(wù)器和客戶(hù)端在建立連接后隨時(shí)主動(dòng)向?qū)Ψ桨l(fā)送數(shù)據(jù)。
WebSocket的特點(diǎn)
- 持久連接:一旦WebSocket連接建立,客戶(hù)端和服務(wù)器就可以在不關(guān)閉連接的情況下進(jìn)行多次數(shù)據(jù)交換,這減少了建立和關(guān)閉連接的開(kāi)銷(xiāo)。
- 全雙工通信:雙方都可以同時(shí)發(fā)送和接收數(shù)據(jù),無(wú)需等待對(duì)方的響應(yīng),這對(duì)于實(shí)時(shí)應(yīng)用(如在線(xiàn)聊天、游戲、協(xié)同編輯、實(shí)時(shí)交易系統(tǒng)等)非常有利。
- 低延遲:相比輪詢(xún)和長(zhǎng)輪詢(xún)技術(shù),WebSocket減少了不必要的網(wǎng)絡(luò)傳輸和延遲,提供了近乎實(shí)時(shí)的數(shù)據(jù)傳輸能力。
- 輕量級(jí):雖然基于TCP,但WebSocket在HTTP握手之后使用了自己的更簡(jiǎn)單的幀協(xié)議,優(yōu)化了數(shù)據(jù)傳輸效率。
WebSocket的工作流程
- 握手:客戶(hù)端首先通過(guò)HTTP請(qǐng)求發(fā)起連接,并包含Upgrade頭信息,表示希望協(xié)議升級(jí)為WebSocket。服務(wù)器確認(rèn)并同意升級(jí)后,連接轉(zhuǎn)為WebSocket協(xié)議。
- 數(shù)據(jù)傳輸:建立連接后,客戶(hù)端和服務(wù)器可以開(kāi)始互相發(fā)送數(shù)據(jù)片段(稱(chēng)為“消息”或“幀”)。這些數(shù)據(jù)可以是文本也可以是二進(jìn)制格式,并且可以實(shí)時(shí)傳輸。
- 關(guān)閉連接:當(dāng)一方完成數(shù)據(jù)傳輸或需要終止連接時(shí),會(huì)發(fā)送關(guān)閉控制幀。收到關(guān)閉指令后,雙方會(huì)清理資源,關(guān)閉連接。
props的概念和使用
在 Vue 2 中,props
是一種特性,用于父組件向子組件傳遞數(shù)據(jù)。
數(shù)據(jù)是單向綁定的,數(shù)據(jù)只能從父組件流向子組件。
使用 props
可以讓組件更加模塊化和可復(fù)用。
props的使用
數(shù)組形式:要簡(jiǎn)單地聲明需要接收的屬性,而不進(jìn)行類(lèi)型檢查或設(shè)置默認(rèn)值。
export default { props: ['message'] }
對(duì)象形式:對(duì) props
進(jìn)行更詳細(xì)的配置,指定類(lèi)型、默認(rèn)值或自定義驗(yàn)證規(guī)則。
export default { props: { message: { type: String, // 指定 prop 類(lèi)型 required: true, // 標(biāo)記 prop 為必填 default: 'default message', // 設(shè)置默認(rèn)值 validator(value) { // 自定義驗(yàn)證函數(shù) return value.length <= 10; } } } }
websocket和Vue2中的props實(shí)時(shí)更新數(shù)據(jù)
父組件中配置websocket
num作為數(shù)據(jù)更新的信號(hào),用props將num數(shù)據(jù)傳給子組件
<template> <div> <Test :num ="num"></Test> <Form class="form" :num ="num"></Form> </div> </template> <script> export default { // ------ mounted(){ // websocket 更新 this.setupWebSocket(); }, methods: { setupWebSocket() { this.ws = new WebSocket(`ws://localhost:8081/example/ws/${999}`); console.log(this.ws); this.ws.addEventListener('open', this.openHandle); this.ws.addEventListener('message', this.messageHandle); this.ws.addEventListener('close', this.closeHandle); this.ws.addEventListener('error', this.errorHandle); }, openHandle() { console.log('WebSocket連接成功?。。?!'); }, closeHandle() { console.log('WebSocket關(guān)閉?。。?!'); if (!this.isHandle) { this.restart(); } this.isHandle = false; }, // 收到消息更新數(shù)據(jù) messageHandle(data) { console.log('前端接收到消息?。。?!',data); // 使組件重新加載 // this.$forceUpdate() this.num =this.num + 1 // 數(shù)據(jù)更新的信號(hào) }, errorHandle() { console.log('WebSocket出錯(cuò)了!?。。?); console.log('error'); }, sendMessage() { console.log('我發(fā)送了消息'); // this.ws.send('請(qǐng)傳數(shù)據(jù)給我!'+input); }, closeWs() { this.ws.close(); }, restart() { console.log('客戶(hù)端與服務(wù)器連接失敗,準(zhǔn)備重連'); this.timer = setInterval(() => { console.log('重連中...'); this.ws = new WebSocket(`ws://localhost:8081/example/ws/${999}`); if (this.ws.readyState === 1) { clearInterval(this.timer); this.timer = null; this.ws.addEventListener('open', this.openHandle); this.ws.addEventListener('close', this.closeHandle); this.ws.addEventListener('message', this.messageHandle); this.ws.addEventListener('error', this.errorHandle); console.log('重連成功'); } }, 1000); }, } // ------ } </script>
子組件接收num數(shù)據(jù),并用watch監(jiān)聽(tīng)num數(shù)據(jù),當(dāng)數(shù)據(jù)發(fā)生改變的時(shí)候,重新發(fā)送get請(qǐng)求
<script> export default { // ------ props:{ //更新信號(hào) num:{ type: Number, default:0, }, }, // 監(jiān)聽(tīng)num watch:{ num(newVal,oldVal) { console.log('newValpf :',newVal,'oldValpf :',oldVal) this.getInfo(); // 重新發(fā)送請(qǐng)求 }, }, // get請(qǐng)求 methods: { getInfo() { axios({ url:'/api/outstanding-kid/kid/getAllUsers', method:'get' }).then((data)=>{ // console.log(data.data.data); const electric = data.data.data.map(item => item.electric) const id = data.data.data.map(item => item.id) this.ChartView(electric,id) }).catch((error)=>{ console.dir(error); }) }, //------ } </script>
通過(guò)websocket更新http請(qǐng)求的好處
- 低延遲和實(shí)時(shí)性:WebSocket建立了一條持久的雙向通信通道,數(shù)據(jù)可以在服務(wù)器和客戶(hù)端之間即時(shí)傳輸,幾乎消除了傳統(tǒng)HTTP請(qǐng)求中的延遲。
- 減少網(wǎng)絡(luò)帶寬和服務(wù)器資源消耗:由于WebSocket僅需建立一次連接,而后復(fù)用該連接傳輸多次數(shù)據(jù),相比HTTP輪詢(xún)減少了建立和斷開(kāi)連接的次數(shù),從而節(jié)省了網(wǎng)絡(luò)資源和服務(wù)器負(fù)載。HTTP輪詢(xún)即使沒(méi)有新數(shù)據(jù),也會(huì)定期發(fā)送請(qǐng)求,浪費(fèi)了帶寬和計(jì)算資源。
- 提高效率和用戶(hù)體驗(yàn):WebSocket減少了不必要的HTTP頭部信息傳輸,減輕了數(shù)據(jù)傳輸?shù)呢?fù)擔(dān)。對(duì)于頻繁交互的應(yīng)用,這能夠顯著提升響應(yīng)速度和用戶(hù)體驗(yàn)。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用vue-cli打包過(guò)程中的步驟以及問(wèn)題的解決
這篇文章主要介紹了使用vue-cli打包過(guò)程中的步驟以及問(wèn)題的解決,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05詳解基于element的區(qū)間選擇組件校驗(yàn)(交易金額)
這篇文章主要介紹了詳解基于element的區(qū)間選擇組件校驗(yàn)(交易金額),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01vue實(shí)現(xiàn)移動(dòng)端table表格簡(jiǎn)單方法
這篇文章主要給大家介紹了關(guān)于vue實(shí)現(xiàn)移動(dòng)端table表格簡(jiǎn)單方法的相關(guān)資料,使用Vue.js開(kāi)發(fā)移動(dòng)應(yīng)用程序時(shí),經(jīng)常需要使用各種UI組件,其中el-table是一個(gè)常用的表格組件,可以方便地展示數(shù)據(jù),需要的朋友可以參考下2023-09-09ElementUI中el-dropdown-item點(diǎn)擊事件無(wú)效問(wèn)題
這篇文章主要介紹了ElementUI中el-dropdown-item點(diǎn)擊事件無(wú)效問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04vue全局混入之狀態(tài)判斷是否執(zhí)行點(diǎn)擊
這篇文章主要介紹了vue全局混入之狀態(tài)判斷是否執(zhí)行點(diǎn)擊方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03vue實(shí)現(xiàn)點(diǎn)擊展開(kāi)點(diǎn)擊收起效果
這篇文章主要介紹了vue實(shí)現(xiàn)點(diǎn)擊展開(kāi),點(diǎn)擊收起效果,首先我們需要定義data里面的數(shù)據(jù),使用computed對(duì)data進(jìn)行處理,需要的朋友可以參考下2018-04-04vue-admin-template模板添加tagsview的實(shí)現(xiàn)
本文主要介紹了vue-admin-template模板添加tagsview的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04