VUE學習筆記——基礎標籤,函式
VUE入門
第一個VUE程式
使用!tab建立標準html模板,嵌入vue例項化
<!-- 開發環境版本,包含了有幫助的命令列警告 --> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
插入模板語法
<div id="app">
{{ message }}
</div>
var app = new Vue({
el: '#app',
data: {
message: 'Hello Vue!'
}
})
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>test</title> </head> <body> {{ message }} <h2 id="app" class = "app"> {{ message }} <span> {{message}} </span>> </h2> <!-- 開發環境版本,包含了有幫助的命令列警告 --> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <script> var app = new Vue({ el:"#app", //el:".app", //el:"div", data:{ message:"VUE hell" } }) </script> </body> </html>
el:掛載點
Vue例項作用範圍
Vue會管理el選項命中的元素及內部的後代元素
可以使用其他的選擇器
如ID、DIV等,建議使用id
雙標籤
可以使用其他的雙標籤,不能使用HTML和BODY雙標籤
data:資料物件
- Vue中用到的資料定義在data中
- data中可以寫複雜型別的資料
- 渲染複雜型別的資料時,遵守js的語法
本地應用
使用vue實現簡單的網頁
Vue指令
1、內容繫結,事件繫結
v-text
<body> <div id = "app"> <h2 v-text="message+'!'"></h2> <h2 v-text="info"></h2> <h2>學院路{{message}}</h2> {{message}} <div> {{ school.name}} {{school.mobile}} </div> <ul> <li> {{campus[0]}} </li> <li> {{campus[1]}} </li> </ul> </div>
-
設定標籤內容--content
-
插值表示式替換內容
-
可以寫表示式
v-html
設定innerHTML
- 設定元素的innerHTML
- 內容中有html結構的會被解析為標籤
- v-text指令只會解析為文字
data:{
content : "<a href='https://www.bilibili.com/'>link </a>"
}
v-on
- v-on指令的作用:為元素繫結事件
- 事件名不需要寫on
- 指令可以寫為@
- 繫結的方法定義在methods中
<input type="button" value = "v-on指令" v-on:click = "makenoise"> <input type="button" value = "v-on簡寫" @click = "makenoise"> <input type="button" value = "雙擊" @dblclick = "makenoise">
實現網頁計數器
- 建立Vue例項時:el(掛載點),data(資料),methods(方法)
- v-on
- this 獲取資料
2、顯示切換,屬性繫結
v-show
- v-show指令作用:根據真假切換元素的顯示狀態
- 原理是修改元素的display,實現隱藏
- 指令後面內容解析為布林值
- 值為true顯示,值為false隱藏
v-if
基本和v-show相同
- V-if指令:更具表示式真假切換元素的顯示狀態
- 操縱dom元素切換顯示狀態
- 表示式值為true,元素存在於dom樹中,為false,從dom樹中移除
- 頻繁切換v-show否則v-if,前者消耗小
v-bind
-
為元素繫結屬性
-
完整寫法v-bind:屬性名
-
簡寫省略v-bind,只保留:屬性名
3、列表迴圈,表單元素繫結
v-for
- v-for:根據資料生成列表結構
- 陣列經常和v-for一起使用
- 語法是(item,index)in資料
- item和index可以結合其他指令一起使用
- 陣列長度的更新會同步到頁面上,是響應式的
v-on-補充
<body>
<div id ="app">
<input type ="button" value="點選" @click="doit(233,'bili')">
<input type="text" @keyup.enter="sayhi" >
</div>
<!-- 開發環境版本,包含了有幫助的命令列警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app = new Vue({
el:"#app",
methods:{
doit:function(p1,p2){
console.log("test");
console.log(p1);
console.log(p2 );
},
sayhi:function(){
alert ("success");
},
}
})
</script>
</body>
</html>
- 事件繫結,函式呼叫傳形參
- 定義方法時定義形參接收實參
- 事件後跟.修飾符 可以進行限制
- .enter可以限制觸發 的按鍵 為回車鍵
- 事件修飾符有多種。
v-module
雙向資料繫結
<body>
<div id ="app">
<input type = "button" value = "修改message" @click="setM">
<input type ="text" v-model="message" @keyup.enter="getM">
<h2>{{message}}</h2>
</div>
<!-- 開發環境版本,包含了有幫助的命令列警告 -->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var app = new Vue({
el:"#app",
data:{
message :"test"
},
methods:{
getM:function(){
alert(this.message)
},
setM:function(){
this.message="函式";
}
},
})
</script>
</body>
</html>
- v-module指令:便捷 的設定和獲取表單元素的值
- 繫結的資料會和表單元素的值相關聯
- 繫結的資料和表單元素值一一對應
前後端分離
經典的JSP+Servlet+JavaBean的MVC時代
半分離
SSM(Spring + SpringMVC + Mybatis)和SSH(Spring + Struts + Hibernate)的Java 框架時代
步驟如下:
(1)瀏覽器請求,CDN返回HTML頁面;
(2)HTML中的JS程式碼以Ajax方式請求後臺的Restful介面;
(3)介面返回Json資料,頁面解析Json資料,通過Dom操作渲染頁面;
後端提供的都是以JSON為資料格式的API介面供Native端使用,同樣提供給WEB的也是JSON格式的API介面。
那麼意味著WEB工作流程是:
1、開啟web,載入基本資源,如CSS,JS等;
2、發起一個Ajax請求再到服務端請求資料,同時展示loading;
3、得到json格式的資料後再根據邏輯選擇模板渲染出DOM字串;
4、將DOM字串插入頁面中web view渲染出DOM結構;
這些步驟都由使用者所使用的裝置中逐步執行,也就是說使用者的裝置效能與APP的執行速度聯絡的更緊換句話說就是如果使用者的裝置很低端,那麼APP開啟頁面的速度會越慢。
為什麼說是半分離的?因為不是所有頁面都是單頁面應用,在多頁面應用的情況下,前端因為沒有掌握controller層,前端需要跟後端討論,我們這個頁面是要同步輸出呢,還是非同步Json渲染呢?而且,即使在這一時期,通常也是一個工程師搞定前後端所有工作。因此,在這一階段,只能算半分離。
首先,這種方式的優點是很明顯的。前端不會嵌入任何後臺程式碼,前端專注於HTML、CSS、JS的開發,不依賴於後端。自己還能夠模擬Json資料來渲染頁面。發現Bug,也能迅速定位出是誰的問題。
然而,在這種架構下,還是存在明顯的弊端的。最明顯的有如下幾點:
1)JS存在大量冗餘,在業務複雜的情況下,頁面的渲染部分的程式碼,非常複雜;
2)在Json返回的資料量比較大的情況下,渲染的十分緩慢,會出現頁面卡頓的情況;
3)SEO( Search Engine Optimization,即搜尋引擎優化)非常不方便,由於搜尋引擎的爬蟲無法爬下JS非同步渲染的資料,導致這樣的頁面,SEO會存在一定的問題;
4)資源消耗嚴重,在業務複雜的情況下,一個頁面可能要發起多次HTTP請求才能將頁面渲染完畢。可能有人不服,覺得PC端建立多次HTTP請求也沒啥。那你考慮過移動端麼,知道移動端建立一次HTTP請求需要消耗多少資源麼?
正是因為如上缺點,我們才亟需真正的前後端分離架構。
前端框架(KnockoutJS、AngularJS、vueJS、ReactJS)為主的MV*時代
大家一致認同的前後端分離的例子就是SPA(Single-page application),所有用到的展現資料都是後端通過非同步介面(AJAX/JSONP)的方式提供的,前端只管展現。從某種意義上來說,SPA確實做到了前後端分離,但這種方式存在兩個問題:
-
WEB服務中,SPA類佔的比例很少。很多場景下還有同步/同步+非同步混合的模式,SPA不能作為一種通用的解決方案;
-
現階段的SPA開發模式,介面通常是按照展現邏輯來提供的,而且為了提高效率我們也需要後端幫我們處理一些展現邏輯,這就意味著後端還是涉足了view層的工作,不是真正的前後端分離。
SPA式的前後端分離,從物理層做區分(認為只要是客戶端的就是前端,伺服器端就是後端)這種分法已經無法滿足前後端分離的需求,我們認為從職責上劃分才能滿足目前的使用場景:
-
前端負責view和controller層
-
後端只負責model層,業務處理與資料持久化等
controller層與view層對於目前的後端開發來說,只是很邊緣的一層,目前的java更適合做持久層、model層的業務。
在前後端徹底分離這一時期,前端的範圍被擴充套件,controller層也被認為屬於前端的一部分。在這一時期:
前端:負責View和Controller層。
後端:只負責Model層,業務/資料處理等。可是服務端人員對前端HTML結構不熟悉,前端也不懂後臺程式碼呀,controller層如何實現呢?這就是node.js的妙用了,node.js適合運用在高併發、I/O密集、少量業務邏輯的場景。最重要的一點是,前端不用再學一門其他的語言了,對前端來說,上手度大大提高。
可以就把Nodejs當成跟前端互動的api。總得來說,NodeJs的作用在MVC中相當於C(控制器)。Nodejs路由的實現邏輯是把前端靜態頁面程式碼當成字串傳送到客戶端(例如瀏覽器),簡單理解可以理解為路由是提供給客戶端的一組api介面,只不過返回的資料是頁面程式碼的字串而已。
用NodeJs來作為橋樑架接伺服器端API輸出的JSON。後端出於效能和別的原因,提供的介面所返回的資料格式也許不太適合前端直接使用,前端所需的排序功能、篩選功能,以及到了檢視層的頁面展現,也許都需要對介面所提供的資料進行二次處理。這些處理雖可以放在前端來進行,但也許資料量一大便會浪費瀏覽器效能。因而現今,增加Node中間層便是一種良好的解決方案。
瀏覽器(webview)不再直接請求JSP的API,而是:
1)瀏覽器請求伺服器端的NodeJS;
2)NodeJS再發起HTTP去請求JSP;
3)JSP依然原樣API輸出JSON給NodeJS;
4)NodeJS收到JSON後再渲染出HTML頁面;
5)NodeJS直接將HTML頁面flush到瀏覽器;
這樣,瀏覽器得到的就是普通的HTML頁面,而不用再發Ajax去請求伺服器了。
Nodejs引領的全棧時代
Apache Tomcat
Ajax