$emit,父組件傳data給子組件,子組件通過$emit來觸發父組件中綁定在子組件身上的事件,達到改變父組件中的data的方法。下面介紹$emit傳值的幾種方法:
一:$emit傳遞單值
子組件Test.vue:
-
<template>
-
-
<div>
-
-
<div>子組件</div>
-
-
<button @click="changeFather">點擊我向父組件傳遞參數</button>
-
-
</div>
-
-
</template>
-
-
-
-
<script>
-
-
export default {
-
-
methods: {
-
-
changeFather() {
-
-
this.$emit("changeEvent",'1');
-
-
}
-
-
}
-
-
};
-
-
</script>
-
-
-
-
<style>
-
-
</style>
父組件:App.vue
-
<template>
-
-
<div id="app">
-
-
<p>這是父組件</p>
-
-
<div>{{myString}}</div>
-
-
<Test @changeEvent="changeMyString" />
-
-
</div>
-
-
</template>
-
-
-
-
<script>
-
-
import Test from "./components/Test";
-
-
export default {
-
-
name: "App",
-
-
components: { Test },
-
-
data: function() {
-
-
return {
-
-
myString: ''
-
-
};
-
-
},
-
-
methods: {
-
-
changeMyString(val) {
-
-
console.log(val);
-
-
this.myString=val;
-
-
}
-
-
}
-
-
};
-
-
</script>
-
-
-
-
<style>
-
-
#app {
-
-
font-family: Avenir, Helvetica, Arial, sans-serif;
-
-
-webkit-font-smoothing: antialiased;
-
-
-moz-osx-font-smoothing: grayscale;
-
-
text-align: center;
-
-
color: #2c3e50;
-
-
margin-top: 60px;
-
-
}
-
-
</style>
點擊按鈕效果如圖:
二:$emit傳遞多個值
子組件Test.vue:
-
<template>
-
-
<div>
-
-
<div>子組件</div>
-
-
<button @click="changeFather">點擊我向父組件傳遞參數</button>
-
-
</div>
-
-
</template>
-
-
-
-
<script>
-
-
export default {
-
-
methods: {
-
-
changeFather() {
-
-
this.$emit("changeEvent",'1','2');
-
-
}
-
-
}
-
-
};
-
-
</script>
-
-
-
-
<style>
-
-
</style>
父組件App.vue:
-
<template>
-
-
<div id="app">
-
-
<p>這是父組件</p>
-
-
<div>{{myString}}</div>
-
-
<Test @changeEvent="changeMyString" />
-
-
</div>
-
-
</template>
-
-
-
-
<script>
-
-
import Test from "./components/Test";
-
-
export default {
-
-
name: "App",
-
-
components: { Test },
-
-
data: function() {
-
-
return {
-
-
myString: ''
-
-
};
-
-
},
-
-
methods: {
-
-
changeMyString(val0,val1) {
-
-
console.log(val0,val1);
-
-
this.myString=val0+val1;
-
-
}
-
-
}
-
-
};
-
-
</script>
-
-
-
-
<style>
-
-
#app {
-
-
font-family: Avenir, Helvetica, Arial, sans-serif;
-
-
-webkit-font-smoothing: antialiased;
-
-
-moz-osx-font-smoothing: grayscale;
-
-
text-align: center;
-
-
color: #2c3e50;
-
-
margin-top: 60px;
-
-
}
-
-
</style>
點擊按鈕,效果如下:
$emit傳遞多個值時,還可以采用數組的形式:
修改子組件Test.vue:
-
<template>
-
-
<div>
-
-
<div>子組件</div>
-
-
<button @click="changeFather">點擊我向父組件傳遞參數</button>
-
-
</div>
-
-
</template>
-
-
-
-
<script>
-
-
export default {
-
-
methods: {
-
-
changeFather() {
-
-
this.$emit("changeEvent",['1','2']);
-
-
}
-
-
}
-
-
};
-
-
</script>
-
-
-
-
<style>
-
-
</style>
父組件App.vue:
-
<template>
-
-
<div id="app">
-
-
<p>這是父組件</p>
-
-
<div>{{myString}}</div>
-
-
<Test @changeEvent="changeMyString" />
-
-
</div>
-
-
</template>
-
-
-
-
<script>
-
-
import Test from "./components/Test";
-
-
export default {
-
-
name: "App",
-
-
components: { Test },
-
-
data: function() {
-
-
return {
-
-
myString: ''
-
-
};
-
-
},
-
-
methods: {
-
-
changeMyString(val) {
-
-
console.log(val);
-
-
this.myString=val[0]+val[1];
-
-
}
-
-
}
-
-
};
-
-
</script>
-
-
-
-
<style>
-
-
#app {
-
-
font-family: Avenir, Helvetica, Arial, sans-serif;
-
-
-webkit-font-smoothing: antialiased;
-
-
-moz-osx-font-smoothing: grayscale;
-
-
text-align: center;
-
-
color: #2c3e50;
-
-
margin-top: 60px;
-
-
}
-
-
</style>
點擊按鈕,效果如下:
三:子組件通過$emit傳遞給父組件傳遞值,并且父組件有自定義參數時:
子組件Test.vue:
-
<template>
-
-
<div>
-
-
<div>子組件</div>
-
-
<button @click="changeFather">點擊我向父組件傳遞參數</button>
-
-
</div>
-
-
</template>
-
-
-
-
<script>
-
-
export default {
-
-
methods: {
-
-
changeFather() {
-
-
this.$emit("changeEvent",1,2);
-
-
}
-
-
}
-
-
};
-
-
</script>
-
-
-
-
<style>
-
-
</style>
父組件:App.vue
-
<template>
-
-
<div id="app">
-
-
<p>這是父組件</p>
-
-
<div>{{myString}}</div>
-
-
<Test @changeEvent="changeMyString('myParameter',...arguments)" />
-
-
</div>
-
-
</template>
-
-
-
-
<script>
-
-
import Test from "./components/Test";
-
-
export default {
-
-
name: "App",
-
-
components: { Test },
-
-
data: function() {
-
-
return {
-
-
myString: ''
-
-
};
-
-
},
-
-
methods: {
-
-
changeMyString(...args) {
-
-
console.log(args);
-
-
this.myString=args;
-
-
}
-
-
}
-
-
};
-
-
</script>
-
-
-
-
<style>
-
-
#app {
-
-
font-family: Avenir, Helvetica, Arial, sans-serif;
-
-
-webkit-font-smoothing: antialiased;
-
-
-moz-osx-font-smoothing: grayscale;
-
-
text-align: center;
-
-
color: #2c3e50;
-
-
margin-top: 60px;
-
-
}
-
-
</style>
點擊按鈕,效果圖如下:
藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請加微信ban_lanlan,報下信息,藍小助會請您入群。歡迎您加入噢~~
希望得到建議咨詢、商務合作,也請與我們聯系01063334945。
分享此文一切功德,皆悉回向給文章原作者及眾讀者. 免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。
藍藍設計( www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務、UI設計公司、界面設計公司、UI設計服務公司、數據可視化設計公司、UI交互設計公司、高端網站設計公司、UI咨詢、用戶體驗公司、軟件界面設計公司。
背景:項目中通過攝像機提供的rtsp流來顯示畫面,但是在編寫項目中,需要將rtsp實時流畫面傳輸到web前端頁面中。于是找了很多方法,都是后臺轉碼轉成rtmp來播放,現在大部分插件和瀏覽器都是支持使用rtmp播放視頻流。而rtsp隨著flash的退出而被復雜化了。網上都是1、通過ffmpeg轉碼后輸出,2、通過攝像機指定的web插件轉碼輔助播放,如海康,大華攝像機;3、還有個猿大師播放器基于猿大師中間件提供的內嵌網頁播放(沒用過,不知道行不行,原本想用現在這個方法行不行的,若不行就用這個猿大師了的)
安裝成功以后,你重新打開一個命令行終端,輸入:ffmpeg -h,如果能輸出 ffmpeg 的相關信息出來,則證明你的電腦安裝 ffmpeg 成功。
創建了一個vuecli(vue2)項目,名稱不要起rtsp2web,與src文件夾同級
下創建一個serve文件夾
-|public
|-favicon.ico
|-index.html
-|src
-|serve
-|.gittignore
-.....
npm init --yes
npm install rtsp2web
//index.js
const RTSP2web = require('rtsp2web')
//服務端的端口號,端口號可以自定義
const port = 8033
new RTSP2web({
port
)}
運行命令:node index.js
在public的index.html中
其中jsmpeg.min.js通過src引入,可以用jsmpeg.js
或者jsmpeg.min.js
都行
<!DOCTYPE html>
<html lang="">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<!--v jsmpeg.min.js文件用在這 v-->
<script src="https://jsmpeg.com/jsmpeg.min.js" charset="utf-8"></script>
<title><%= htmlWebpackPlugin.options.title %></title>
</head>
<body>
<noscript>
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
<script>
var rtsp = 'rtsp://username:password@ip:port/live'
window.onload = () => {
//這里的port要與index.js的port保持一致
new JSMpeg.Player("ws://localhost:8033/rtsp?url="+btoa(rtsp), {
canvas: document.getElementById("canvas")
})
}
</script>
</html>
#####在vue頁面中用canvas
中播放視頻
如 在App.vue中這樣用:
<template>
<div id="app">
<!-- <img alt="Vue logo" src="./assets/logo.png">
<HelloWorld msg="Welcome to Your Vue.js App"/> -->
<canvas id="canvas" style="width: 600px; height: 600px;"></canvas>
</div>
</template>
為什么node index.js之后沒反應?
—檢查端口號是否填寫對應,index.js中的端口要與script里的端口保持一致
|
為什么長時間未顯示圖像?
—需要等待大概1-2分鐘,就會顯示畫面。至于這么長時間未顯示,小弟也不知道啊。。希望大佬指點。。
完事了就,這是我歷經千辛萬苦找到的方法,弄這個vue中播放rtsp搞了好久,技術太拉了我,只能用這些小玩意來搞。原本打算用java或者python通過拉rtsp流解析成rtmp的,奈何能力不足,也懶得思考懶得搞懶得弄,所以擺爛了QAQ
若哪里有講的不妥和使用不當的地方還請您告知一下,萬分感謝大佬指點,小弟深表感謝<抱拳>
-----------------------------------------------------------------------------------------------------------
https://zhuanlan.zhihu.com/p/531899593 ??
藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請加微信ban_lanlan,報下信息,藍小助會請您入群。歡迎您加入噢~~
希望得到建議咨詢、商務合作,也請與我們聯系01063334945。
分享此文一切功德,皆悉回向給文章原作者及眾讀者. 免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。
藍藍設計( www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務、UI設計公司、界面設計公司、UI設計服務公司、數據可視化設計公司、UI交互設計公司、高端網站設計公司、UI咨詢、用戶體驗公司、軟件界面設計公司。
搜索“視頻傳輸協議”,一般會搜出來RTP,RTSP,UDP等等。光看這些協議,可能有些人會覺得奇怪為什么要把udp也往上放一起,rtp不是可以基于udp?!同時,很多文章主要去講解各個協議之間的差異,而沒有從更為宏觀的角度來考慮。本文將結合OSI的分層思路,將不同協議之間的關系都梳理清楚;同時也從視頻傳輸與組網角度進行介紹。
再者,視頻有很多封裝格式,比如m3u8,mp4等;也有很多音視頻編碼格式,比如h264,h265等,那為何有這么多的封裝格式類型和音視頻編碼格式類型呢?一方面是解決存儲的問題;另一方面是支持不同播放器的解析;但更重要的是不同的傳輸協議可以支持的音視頻編碼格式有差異,這也是由于不同的應用場景下形成的歷史原因。
流媒體(streaming media),是指將一連串的媒體數據包從服務器端發送到客戶端,可以實現邊下邊播,此技術使得數據包可以像流水一樣發送。傳統的方式需要在使用前下載整個文件,存儲到本地后才能進行播放;而流媒體只允許下載一小部分(存在視頻關鍵幀)就能進行播放。
流媒體技術不是一種單一的技術,它將網絡技術、音視頻技術還有終端緩存技術等有機地結合。也就是說,在網絡上要實現流媒體技術,必須要先制作、發布、傳輸和播放等,這需要服務器端、終端以及網絡都要能支持。當前很多的視頻軟件或者網站都是用到了這種技術。歸結下來是:
1.內容的產生。這里是指將視頻源制作成為可以對外發布的視頻格式,以及適合在網絡上傳播的分辨率和碼率。這主要用到了視頻的編解碼技術??紤]的輸出參數,如分辨率、碼率、音視頻編碼格式、封裝格式等都需要結合應用場景和傳輸方式統一考慮。
2.對外發布。這里主要是指能夠支撐服務器對外輸出視頻資源的技術,常見的有各種流媒體網絡傳輸協議技術及其需要服務器端支撐的技術。這里的流媒體網絡傳輸協議比如:
3.組網和傳輸。
這里的傳輸還得考慮一個概念,是服務器對外主動推數據,還是等待終端到服務器端拉數據,這是兩個完全相反的處理方式。對于組播或者廣播的組網方式,往往采用的是服務器主動對外推送數據;而對于單播來說主要是終端向服務器端主動拉數據。
這里涉及到的IP組網方式中的傳輸類型有:廣播、單播、組播。
不管是什么類型的組網方式,在傳輸層就有UDP和TCP。下面也將從OSI等層面講講這些底層傳輸協議之間的關系。
4.視頻播放。這里主要是從終端側角度說,在不同操作系統中能夠進行播放視頻的播放器,比如vlc等,不同的播放器支持對不同類型的視頻數據進行播放。
從圖中也可以看到IP層(網絡層)的上層是傳輸層,通過TCP和UDP等方式進行數據包的傳輸。
(PS:下圖為網絡中所找https://blog.csdn.net/yaopeng_2005/article/details/7064869)
結合上圖,再補一個wiki上的互聯網協議套組圖,一看就更明白了。
從上面兩個圖中也可以很清楚地看到,TCP和UDP在接下去的內容有很重要的地位,這里也簡單介紹下,深度知識請自行搜索。
組播(multicast)
又稱為多點廣播或群播,或多播,主要是指將信息同時傳遞給一組目的地址。消息在每個網絡鏈路上只需傳遞一次,而且只有在鏈路分叉時,消息才會被復制,使用的效率是最高的。也正是因為這個原因,以前的廣電網絡中,針對直播多采用組播方式,流量的傳輸成本明顯降低很多。
單播:
其實是組播的一種特殊方式,即常規的點到點信息傳遞。如果所有傳輸中是以單播的方式傳遞給多個接收方,必須向每個接收者都發送一份數據副本這么多。
廣播
其實也算是組播的一種特殊方式,就是一對所有的通信方式,對每一臺主機發出的信號都進行無條件復制并轉發,所有的接收點都可以收到所有信息。
注意,組播一般指的是IP組播,常與RTP等音視頻協議相結合。雖然組播的設計理念很好,但是它需要對網絡內部的狀態比單播要多得多。實際商用中,組播主要應用在較為簡單的、只有單個源斷的情況,如之前提到廣電網絡內部用到的組播方式,UDP組播。
以上是不同類型的IP組播方式,實際在采用中要結合具體情況進行調整。比如,如果非要使用廣播,但是采用的場景不合適,也有可能產生廣播風暴。
組播、廣播、單播也介紹了基本的概念,但是他們與視頻傳輸有什么關系呢?
文章上面也提到了,組播是從IP層面的傳輸策略,而所有的視頻傳輸協議其數據包大部分都經過UDP和TCP,經由IP層進行傳輸到目的地。因此不同的IP傳輸策略與傳輸協議進行結合,就能夠落地到具體的應用場景。
同時需要注意的是,采用組播方式可以通過設置網卡為混雜模式或為多播模式,具體也是根據網卡的特性進行差異處理。如果處理方式不當,比如設置成了廣播,可能會導致在同網絡下,你在播放視頻,然后其他相同網絡下接收端也將有相應的流量,而導致他們的對外服務網口的流量被占滿。
從下圖中可以看到,標紅色的就是大家經常說的視頻傳輸協議。但是從圖中可以看到他們其實是有基于的關系,比如HLS都是基于HTTP進行傳輸,而HTTP在傳輸層都是依賴tcp數據包,再經由ip層進行分發。
1)UDP
基于UDP傳輸的視頻數據,比如udp://238.123.45.1:3001,在網絡可達的情況下,即可進行播放??梢圆捎胿lc等播放器進行播放。
UDP視頻數據傳輸可以采用單播,組播或廣播的方式,具體采用哪種方式根據具體的組網情況進行控制。
上面也有提到過,廣電網絡中多采用組播的方式進行直播數據傳輸,這也是得益于廣電網絡的專網特性以及視頻源輸出可以控制到單一等特性。
UDP的組播大部分是采用MPEG TS流,廣電網絡中很多視頻,其視頻編碼格式也大部分是mepg2
2)RTP
整個RTP協議包括RTP數據協議和RTP控制協議(RTCP)。此外,這里也將經常一起提的RTSP介紹下。
RTP(實時傳輸協議,Real-time Transport Protocol),是一種網絡傳輸協議
RTP協議說明了傳遞音頻和視頻的標準數據包的格式。最早是作為多播協議的,后來主要應用在單播中。RTP是創建在UDP協議之上的,主要應用于流媒體、視頻會議等系統業務上。
RTP為端到端的數據傳輸提供了時間信息和流同步,但不保證服務質量,而是由服務質量由RTCP。
在RTP的數據包封裝中,包含了時間戳、標記位、同步源標識等信息。
RTP從上層接收到流媒體的數據(如H264),封裝成RTP數據包,并將其發往UDP端口中的偶數端口。
RTCP(實時傳輸控制協議,Real-time Transport Control Protocol或RTP Control Protocol)
RTP的姐妹協議。RTP使用的是偶數UDP端口,RTCP采用的是RTP下一個端口,也就是下一個奇數的端口。RTCP也是基于UDP進行傳輸的。
RTCP本身不做數據傳輸,主要與RTP協作,將視頻媒體數據打包和發送,并定期在流媒體會話參與者之間傳輸控制數據,并為RTP提供QoS反饋,簡單點說是主要保證音視頻的同步。
RTCP接收到控制信息后,封裝為RTCP控制包,并發往RTP端口下一個偶數端口。
RTSP(實時流協議,Real Time Streaming Protocol)
RTSP是一種網絡應用協議,主要來創建和控制流媒體服務器與終端之間的會話??刂祁惖恼埱笾饕逿CP協議。
通過RTSP對流媒體數據進行控制和播放,比如進行播放、暫停、快進等操作,它定義了具體的控制消息、操作方法和狀態碼等。
與RTP、RTCP配合,在廣電網絡內部主要應用在點播場景比較多,而直播主要走UDP組播。在互聯網場景下,也有用于直播和點播的,但是相對來說使用較少。
請求的url為:rtsp://testdomain/test.mp4/streamid=0
需要服務器端和客戶端都能夠支持RTSP的控制。一般客戶端采用vlc即可,而服務器端采用Darwin Streaming Server,ffmpeg等建立流媒體服務。
3)RTMP(實時消息協議,Real-Time Messaging Protocol)
包括RTMP、RTMPT等一系列的協議,Adobe為flash播放器和服務器之間音視頻數據傳輸的協議。
4)HTTP
而基于HTTP協議的就更多了,如上圖。如果服務器部署了流媒體的服務,如Nginx等,就可以對外提供視頻播放服務了。
這里也需要說明,視頻的播放一般分為點播和直播,有些協議作為直播的傳輸協議反而是更好的,比如RTMP,時延就比較低,但RTMP做CDN成本相對較高。CDN支持很好的HTTP如果能支持直播,當前也有很多協議能支持通過HTTP的方式實現直播流媒體。
自適性流媒體(adaptive bitrate streaming,ABS)也叫碼流自適應,是流媒體服務器準備各種碼流的視頻流,所有的視頻碼流都是相同時段完全統一圖像的音視頻數據,客戶端根據網絡情況和CPU使用情況等進行動態調整。
主要有MPEG-DASH、HLS、HDS、MSS等技術方案,這幾個也是上圖中最上層的流媒體傳輸協議技術。通過這些傳輸協議封裝的視頻源,可以支持有多種碼率,并支持播放器客戶端在播放時,根據帶寬情況自動調整碼率以適應用戶的最佳觀看效果——不卡頓,不重新加載等。
這里也僅僅對碼流自適應技術做了簡單介紹,由于現在這種技術應用相當廣泛,后面將詳細介紹這種技術。
【說明】
文章轉自,華為云社區,作者Higeeon,相關版權解釋權歸原作者所有。https://bbs.huaweicloud.com/blogs/fed3df04b1e011e9b759fa163e330718
藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請加微信ban_lanlan,報下信息,藍小助會請您入群。歡迎您加入噢~~
希望得到建議咨詢、商務合作,也請與我們聯系01063334945。
分享此文一切功德,皆悉回向給文章原作者及眾讀者. 免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。
藍藍設計( www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務、UI設計公司、界面設計公司、UI設計服務公司、數據可視化設計公司、UI交互設計公司、高端網站設計公司、UI咨詢、用戶體驗公司、軟件界面設計公司。
JSON(JavaScript Object Notation, JS對象簡譜)是一種輕量級的數據交換格式。它基于 ECMAScript(European Computer Manufacturers Association, 歐洲計算機協會制定的js規范)的一個子集,采用完全獨立于編程語言的文本格式來存儲和表示數據。簡潔和清晰的層次結構使得 JSON 成為理想的數據交換語言。 易于人閱讀和編寫,同時也易于機器解析和生成,并有效地提升網絡傳輸效率。
JSON源自于JavaScript,是一種輕量級(Light-Meight)、基于文本的(Text-Based)、可讀的(Human-Readable)格式。
在現在的開發中,能夠進行數據交換格式的,包括兩個JSON XML。
JSON是存儲和交換文本信息的語法,類似 XML,JSON比 XML更小、更快,更易解析。
那么,簡而言之,對JSON的說明總結如下:
- JSON是獨立于任何編程語言的數據格式
- 是一種用于存儲和傳輸數據的輕量級格式
- 語法是自描述的,便于人類閱讀和理解
- 數組(Array)用方括號 "[]" 表示
- 對象(0bject)用大括號 "{}" 表示
- 名稱 / 值 對(name/value)組合成數組和對象
- 名稱( name )置于雙引號中,值(value)有字符串、數值、布爾值、null、對象和數組
- 并列的數據之間用逗號 "," 分隔
- 名稱/值對包括字段名稱(在雙引號中),后面寫一個冒號,然后是值
需要注意的是:
JSON不支持注釋。向 JSON添加注釋無效
JSON文件的文件類型是
.json
JSON文本的
MIME
類型是application/json
json是以對象的形式存在的,直接獲取JSON數據可通過如下方法:
1. json對象.鍵名
2. json對象["鍵名"]
3. 數組對象[索引]
4. 遍歷
代碼示例:
-
//定義基本格式
-
var person = { name: "張三", age: 23, gender: true };
-
var persons = [
-
{ name: "張三", age: 23, gender: true },
-
{ name: "李四", age: 24, gender: true },
-
{ name: "王五", age: 25, gender: false },
-
];
-
-
//獲取person對象中所有的鍵和值
-
//for in 循環
-
/* for(var key in person){
-
//這樣的方式獲取不行。因為相當于 person."name"
-
//alert(key + ":" + person.key);
-
alert(key+":"+person[key]);
-
}*/
-
-
//獲取persons中的所有值
-
for (var i = 0; i < persons.length; i++) {
-
var p = persons[i];
-
for (var key in p) {
-
console.log(key + ":" + p[key]);
-
}
-
}
輸出結果為:
先在控制臺中打印一下JSON對象,看看有什么,如圖:
顯而易見,在JavaScript中JSON對象僅有兩個方法:parse和stringify。后面會詳細介紹一下這兩個方法
序列化的概念:序列化是將對象轉化為字節序列的過程。對象序列化后可以在網絡上傳輸,或者保存到硬盤上。
將對象序列化成json字符串: JSON.stringify(json對象);
反序列化:將json字符串反序列化為對象: JSON.parse(str)
API介紹:用來解析 JSON字符串,構造由字符串描述的 JavaScript
值或對象,傳入的字符串不符合 JSON規范會報錯
語法:
JSON.parse(str, reviver);
str
:要解析的 JSON字符串reviver
:可選的函數function(key,value)
,該函數的第一個參數和第二個參數分別代表鍵值對的鍵和值,并可以對值進行轉換(函數返回值當做處理后的value)
代碼示例:
-
// JSON.parse() 解析JSON字符串, 將JSON轉換為對象
-
let json = '{"name": ["js", "webpack"], "age": 22, "gridFriend": "ljj"}';
-
console.log(JSON.parse(json));
-
// {name: Array(2), age: 22, gridFriend: 'ljj'}
-
-
// 第二個參數是一個函數,key和value代表每個key/value對
-
let result = JSON.parse(json, (key, value) => {
-
if (key == "age") {
-
return `年齡:${value}`;
-
}
-
return value;
-
});
-
console.log(result);
-
//{name: Array(2), age: '年齡:22', gridFriend: 'ljj'}
API介紹:將一個 JavaScript
對象或值轉換為 JSON字符串
如果指定了一個 replacer
函數,則可以選擇性地替換值,或者指定的 replacer
是數組,則可選擇性地僅包含數組指定的屬性
語法:
JSON.stringify(value, replacer, space)
value:將要序列化成 一個 JSON 字符串的值
replacer:
- 如果該參數是一個函數,則在序列化過程中,被序列化的值的每個屬性都會經過該函數的轉換和處理
- 如果該參數是一個數組,則只有包含在這個數組中的屬性名才會被序列化到最終的 JSON 字符串中
- 如果該參數為 null 或者未提供,則對象所有的屬性都會被序列化
space:指定縮進用的空白字符串,用于美化輸出
- 如果參數是個數字,它代表有多少的空格;上限為10。該值若小于1,則意味著沒有空格
- 如果該參數為字符串(當字符串長度超過10個字母,取其前10個字母),該字符串將被作為空格
- 如果該參數沒有提供(或者為 null),將沒有空格
代碼示例:
-
let obj = {
-
name: "jsx",
-
age: 22,
-
lesson: ["html", "css", "js"],
-
};
-
let json = JSON.stringify(obj);
-
console.log(json);
-
// {"name":"jsx","age":22,"lesson":["html","css","js"]}
-
-
// 第二個參數replacer 為函數時,被序列化的值得屬性都會經過該函數轉換處理
-
function replacer(key, value) {
-
if (typeof value === "string") {
-
return undefined;
-
}
-
return value;
-
}
-
let result = JSON.stringify(obj, replacer);
-
console.log(result);
-
// {"age":22,"lesson":[null,null,null]}
-
-
// 當replacer參數為數組,數組的值代表將被序列化成 JSON 字符串的屬性名
-
let result1 = JSON.stringify(obj, ["name", "lesson"]);
-
// 只保留 “name” 和 “lesson” 屬性值
-
console.log(result1);
-
// {"name":"jsx","lesson":["html","css","js"]}
-
-
// 第三個參數spcae,用來控制結果字符串里面的間距
-
let result2 = JSON.stringify(obj, null, 4);
-
console.log(result2);
-
/*{
-
"name": "jsx",
-
"age": 22,
-
"lesson": [
-
"html",
-
"css",
-
"js"
-
]
-
}*/
注意:如果replacer是一個函數,則該函數會進行深處理,即如果鍵值對的值也是一個數組,則也會執行該函數
- 轉換值如果有
toJSON()
方法,該方法定義什么值將被序列化- 非數組對象的屬性不能保證以特定的順序出現在序列化后的字符串中
- 布爾值、數字、字符串的包裝對象在序列化過程中會自動轉換成對應的原始值,undefined、任意的函數以及 symbol 值,在序列化過程中會被忽略(出現在非數組對象的屬性值中時)或者被轉換成 null(出現在數組中時)。函數、undefined 被單獨轉換時,會返回 undefined,如JSON.stringify(function(){}) or JSON.stringify(undefined)
- 對包含循環引用的對象(對象之間相互引用,形成無限循環)執行此方法,會拋出錯誤
- 所有以 symbol 為屬性鍵的屬性都會被完全忽略掉,即便 replacer 參數中強制指定包含了它們
- Date 日期調用了 toJSON() 將其轉換為了 string 字符串(同Date.toISOString()),因此會被當做字符串處理
- NaN 和 Infinity 格式的數值及 null 都會被當做 null
- 其他類型的對象,包括 Map/Set/WeakMap/WeakSet,僅會序列化可枚舉的屬性
藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請加微信ban_lanlan,報下信息,藍小助會請您入群。歡迎您加入噢~~
希望得到建議咨詢、商務合作,也請與我們聯系01063334945。
分享此文一切功德,皆悉回向給文章原作者及眾讀者. 免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。
藍藍設計( www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務、UI設計公司、界面設計公司、UI設計服務公司、數據可視化設計公司、UI交互設計公司、高端網站設計公司、UI咨詢、用戶體驗公司、軟件界面設計公司。
1.get請求一般是去取獲取數據(其實也可以提交,但常見的是獲取數據);
post請求一般是去提交數據。
2.get因為參數會放在url中,所以隱私性,安全性較差,請求的數據長度是有限制的,
不同的瀏覽器和服務器不同,一般限制在 2~8K 之間,更加常見的是 1k 以內;
post請求是沒有的長度限制,請求數據是放在body中;
3.get請求刷新服務器或者回退沒有影響,post請求回退時會重新提交數據請求。
4.get請求可以被緩存,post請求不會被緩存。
5.get請求會被保存在瀏覽器歷史記錄當中,post不會。get請求可以被收藏為書簽,因為參數就是url中,但post不能。它的參數不在url中。
6.get請求只能進行url編碼(appliacation-x-www-form-urlencoded),post請求支持多種(multipart/form-data等)。
深入理解
1…GET 和 POST都是http請求方式, 底層都是 TCP/IP協議;通常GET 產生一個 TCP 數據包;POST 產生兩個 TCP 數據包(但firefox是發送一個數據包),
2.對于 GET 方式的請求,瀏覽器會把 http header 和 data 一并發送出去,服務器響應 200
(返回數據)表示成功;
而對于 POST,瀏覽器先發送 header,服務器響應 100, 瀏覽器再繼續發送 data,服
務器響應 200 (返回數據)。
藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請加微信ban_lanlan,報下信息,藍小助會請您入群。歡迎您加入噢~~
希望得到建議咨詢、商務合作,也請與我們聯系01063334945。
分享此文一切功德,皆悉回向給文章原作者及眾讀者. 免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。
藍藍設計( www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務、UI設計公司、界面設計公司、UI設計服務公司、數據可視化設計公司、UI交互設計公司、高端網站設計公司、UI咨詢、用戶體驗公司、軟件界面設計公司。
rpx是響應式px
rpx是一種根據屏幕寬度自適應的動態單位。以750寬的屏幕為基準,750rpx正好是屏幕的寬度。屏幕變寬,rpx實際顯示效果會等比放大,但在App端和h5端,屏幕寬度達到960px時,默認將按照375px的屏幕寬度進行計算。在開發移動端項目時選擇rpx作為尺寸單位。
uni-app在App端,H5端和小程序都支持rpx,并且可以配置不同屏幕寬度的計算方式。
頁面元素在uni-app的寬度計算公式如下:
750 * 元素在設計稿中的寬度 / 設計稿基準寬度
舉例說明:
但是要注意的是
拓展:在設置文件mainfest.json里開啟px轉rpx(默認關閉),所有的px可一鍵轉換為rpx
“transformPx”:false
rpx直接支持動態綁定
<view class="test" :style="{width:winWidth + 'rpx;'}"></view>
vue項目中,前端與后臺進行數據請求或者提交的時候,如果后臺沒有設置跨域,前端本地調試代碼的時候就會報“No 'Access-Control-Allow-Origin' header is present on the requested resource.” 這種跨域錯誤。
要想本地正常的調試,解決的辦法有三個:
一、后臺更改header
header('Access-Control-Allow-Origin:*');//允許所有來源訪問
header('Access-Control-Allow-Method:POST,GET');//允許訪問的方式
這樣就可以跨域請求數據了
二、使用JQuery提供的jsonp (注:vue中引入jquery,自行百度)
methods: {
getData () {
var self = this
$.ajax({
url: 'http://f.apiplus.cn/bj11x5.json',
type: 'GET',
dataType: 'JSONP',
success: function (res) {
self.data = res.data.slice(0, 3)
self.opencode = res.data[0].opencode.split(',')
}
})
}
}
通過這種方法也可以解決跨域的問題。
三、使用http-proxy-middleware 代理解決(項目使用vue-cli腳手架搭建)
例如請求的url:“/business/remind/user”
1、打開vue.config.js.js,在proxy中添寫如下代碼:
// 運行配置
devServer: {
port: '9527', //代理端口
open: false, //項目啟動時是否自動打開瀏覽器,我這里設置為false,不打開,true表示打開
proxy: {
'/api': {
target: process.env.VUE_APP_HTTP_URL,
changeOrigin: true, //是否跨域
pathRewrite: { //重寫路徑
'^/api': '/' // 或 者 'http://localhost:8080/api'
}
// 既然我們設置了代理,則所有請求url都已寫成/api/xxx/xxx,那請求如何知道我們到底請求的是哪個服務器的數據呢
// 因此這里的意義在于, 以 /api開頭的url請求,代理都會知道實際上應該請求那里,
// ‘我是服務器/api’,后面的/api根據實際請求地址決定,即我的請求url:/api/test/test,被代理后請求的則是
// https://我是服務器/api/test/test
}
}
},
附帶vue.config.js下的代碼
const chalk = require('chalk')
const path = require('path');
function resolve (dir) {
return path.join(__dirname, dir)
}
module.exports = {
// 沒有書寫outputDir屬性 默認'dist' 對應dev.assetsSubDirectory
outputDir: 'dist',
// https://vuejs.org/v2/guide/installation.html#Runtime-Compiler-vs-Runtime-only
// compiler: false,
//在vue-cli.3.3版本后 baseUrl被廢除了,因此這邊要寫成 publicPath ( 資源地址 )
publicPath: process.env.NODE_ENV === 'production' ? process.env.VUE_APP_PUBLICPATH : '/' ,
// css相關配置
css: {
// 是否使用css分離插件 ExtractTextPlugin
extract: true,
// 開啟 CSS source maps?
sourceMap: false,
// css預設器配置項
loaderOptions: {}
// 啟用 CSS modules for all css / pre-processor files.
// modules: false
},
// 運行配置
devServer: {
port: '8222', //代理端口
open: false, //項目啟動時是否自動打開瀏覽器,我這里設置為false,不打開,true表示打開
proxy: {
'/api': {
target: process.env.VUE_APP_HTTP_URL,
changeOrigin: true, //是否跨域
pathRewrite: { //重寫路徑
'^/api': '/' // 或 者 'http://localhost:8080/api'
}
// 既然我們設置了代理,則所有請求url都已寫成/api/xxx/xxx,那請求如何知道我們到底請求的是哪個服務器的數據呢
// 因此這里的意義在于, 以 /api開頭的url請求,代理都會知道實際上應該請求那里,
// ‘我是服務器/api’,后面的/api根據實際請求地址決定,即我的請求url:/api/test/test,被代理后請求的則是
// https://我是服務器/api/test/test
}
}
},
chainWebpack: config => {
// 提示輸出的哪個地址
console.log(chalk.blueBright('\n\n running ' + process.env.VUE_APP_PROJ_NAME + ' : ') +
chalk.yellowBright(process.env.VUE_APP_HTTP_URL + ' please wait... \n'));
// 判斷不同環境 做相應處理
if(process.env.NODE_ENV === 'production') {
// 測試生產環境, 不壓縮js代碼
if (process.env.VUE_APP_TITLE === 'alpha') {
config.optimization.minimize(false)
}
}
//set第一個參數:設置的別名,第二個參數:設置的路徑
config.resolve.alias
.set('@',resolve('./src'))
.set('components',resolve('./src/components'))
.set('assets',resolve('./src/assets'))
.set('views',resolve('./src/views'))
.set('network',resolve('./src/network'))
//注意 store 和 router 沒必要配置
config.plugin('html')
.tap(args => {
args[0].title = '公募綜合業務平臺'
return args
})
}
}
藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請加微信ban_lanlan,報下信息,藍小助會請您入群。歡迎您加入噢~~
希望得到建議咨詢、商務合作,也請與我們聯系01063334945。
分享此文一切功德,皆悉回向給文章原作者及眾讀者. 免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。
藍藍設計( www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務、UI設計公司、界面設計公司、UI設計服務公司、數據可視化設計公司、UI交互設計公司、高端網站設計公司、UI咨詢、用戶體驗公司、軟件界面設計公司。
我使用命令 npm run dev 啟動項目 報了下面的錯。
'webpack-dev-server' 不是內部或外部命令,也不是可運行的程序
> webpack-dev-server --inline --progress --config build/webpack.dev.conf.js
'webpack-dev-server' 不是內部或外部命令,也不是可運行的程序
或批處理文件。
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! vue@1.0.0 dev: `webpack-dev-server --inline --progress --config build/webpack.dev.conf.js`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the vue@1.0.0 dev script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm WARN Local package.json exists, but node_modules missing, did you mean to install?npm ERR! A complete log of this run can be found in:
npm ERR! C:\Users\lara\AppData\Roaming\npm-cache\_logs\2018-06-12T09_40_42_892Z-debug.log
什么環境都是好的,剛使用npm run dev 啟動了一個前端項目都是好的,但是現在這個項目就不行了。
刪除項目的node_modules文件夾(當前運行的項目中沒有node_modules 文件夾的直接運行第二步)
在項目目錄里運行 npm install 命令
在項目目錄里運行npm run build 命令
在項目目錄里運行npm run dev 命令
這樣我就可以成功運行項目了。
1.區別:vuex存儲在內存,localstorage(本地存儲)則以文件的方式存儲在本地,永久保存(不主動刪除,則一直存在);sessionstorage( 會話存儲 ) ,臨時保存。localStorage和sessionStorage只能存儲字符串類型,對于復雜的對象可以使用ECMAScript提供的JSON對象的stringify和parse來處理
2.應用場景:vuex用于組件之間的傳值,localstorage,sessionstorage則主要用于不同頁面之間的傳值。
3.永久性:當刷新頁面(這里的刷新頁面指的是 --> F5刷新,屬于清除內存了)時vuex存儲的值會丟失,sessionstorage頁面關閉后就清除掉了,localstorage不會。
注:大家可能覺得用localstorage可以代替vuex, 對于不變的數據確實可以,但是當兩個組件共用一個數據源(對象或數組)時,如果其中一個組件改變了該數據源,希望另一個組件響應該變化時,localstorage,sessionstorage無法做到,原因就是區別1。
vuex是存儲在頁面上的變量,說到底還是個Object,刷新頁面就清空了。而storage是存儲在瀏覽器的,和頁面就無關了,刷新頁面也不會清空
分享此文一切功德,皆悉回向給文章原作者及眾讀者.
免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。
藍藍設計( www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務、UI設計公司、界面設計公司、UI設計服務公司、數據可視化設計公司、UI交互設計公司、高端網站設計公司、UI咨詢、用戶體驗公司、軟件界面設計公司
我們經常會將Word轉換成PDF,下面給大家介紹一種很不錯的Word轉PDF格式的方式。
打開瀏覽器搜索speedpdf找到并打開在線轉換工具首頁,選擇主頁上的Word轉PDF進入轉換(也可以點擊上方所有工具字樣,選擇Word轉PDF進入)。
將需要轉換的Word文檔添加上傳后,點擊進度條后面的轉換按鈕,就可以開始轉換了,等待轉換完成后點擊下載箭頭即可。
如果轉換前有登錄賬戶,還可以通過點擊登錄頭像處,選擇賬戶,在轉換記錄中查看轉換狀態和下載轉換后的文檔。
分享此文一切功德,皆悉回向給文章原作者及眾讀者.
免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。
藍藍設計( www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務、UI設計公司、界面設計公司、UI設計服務公司、數據可視化設計公司、UI交互設計公司、高端網站設計公司、UI咨詢、用戶體驗公司、軟件界面設計公司
藍藍設計的小編 http://www.syprn.cn