目錄javascript
@(個人分享)[Vue]html
本次分享創建在一個假設爲前提,假設大家都已經熟練地使用jquery。前端
不得不認可,jquery是一個很是偉大的發明,jquery有很是強大的選擇器,比起getelementById來,不知道要好用多少,並且它還爲開發人員作了不少瀏覽器兼容方面的工做,最明顯的例子就是jQuery.Ajax()。有了這個ajax方法,你不用再雲根據瀏覽器內核的不一樣而建立不一樣的對象發送請求。
jQuery是基於DOM來操做的。也就是說,咱們在操做頁面的時候,必定是先獲取到了某個dom元素,再對這個dom進行操做。好比我想找到頁面上一個id爲"mollable"的label元素,並修改的顯示文字爲「修改後的文字」,我須要這樣作:vue
$('label#mollable').html('修改後的文字');
這樣看起來很好,目的明確、操做清晰。java
有不少時候,咱們須要把數據從服務端獲取過來,再加載到前端。這個時候,咱們就須要大量的拼接HTML。好比,我須要在ul上面新增一條名爲「《大話代碼架構》」的記錄。
原始HTML以下:jquery
<ul> <li>《春風八百里,不如碰見你》</li> <li>《ASP.net入門很簡單》</li> </ul>
我要的js代碼看起來像是這樣:程序員
$('<li>《大話代碼架構》</li>').apendTo($('ul'));
這是比較簡單的代碼。在不少時候,咱們要增長的dom元素遠遠沒有這麼簡單。那麼,html拼接的過程就極有可能出錯。 這時,出現了「模板引擎」,我之前經常使用的模板引擎是arttemplate。固然,也有其它很是優秀的引擎框架。ajax
所謂模板引擎,你們必定據說過,像C#裏面有偉大的NVelocity,或者大家使用過的一些CMS模板也能夠算是模板引擎。模板引擎的思想,就是先搞一個模板,而後再這個模板上挖坑,最後用數據來填坑。下面,我將以arttemplate來講明.
假設我有這樣一個頁面,這個頁面上要展現人員的信息,人員信息包含姓名、性別、年齡。後端
<div id="container"> <ul id="ulPersonList"> <li> <div> <img src="頭像" /> <label>姓名</label> <label>性別</label> <label>年齡</label> </div> </li> </ul> </div>
接下來,我要根據這個頁面來挖坑了,挖坑的原則很簡單,就是把變化地的方都找出來,用「佔位符」來代替。好比上面代碼中的頭像、姓名、性別、年齡這幾個地方都是會變的,因此我就把他們用用佔位符來表示,以下:瀏覽器
<script id="test" type="text/html"> <li> <div> <img src="{{headImg}}" /> <label>{{name}}</label> <label>{{gender}}</label> <label>{{age}}</label> </div> </li> </script>
第三步,我要把數據填充到模板中的「佔位符」上。
// 定義一個數據 var data = { headImg:"/img/1.jpg", name:"testName", gender:"男", age:32 }; // 調用arttemplate的template方法,傳入數據、模板,獲得結果字符串 var html = template('test', data); // 將獲得的字符串拼接到ul中 $(html).appentTo($('ul'));
到這裏爲止,模板引擎的示例就演示完了。能夠看到,核心代碼是
// 調用arttemplate的template方法,傳入數據、模板,獲得結果字符串 var html = template('test', data);
這句話的目的是獲得一個字符串,這個字符串就好像咱們本身寫字符串拼接代碼同樣。只不過有了arttemplate的幫助,咱們能夠藉助模板來獲得目的字符串。但,本質仍是要獲得一個字符串,讓後面的代碼把獲得的字符串拼接到dom元素上。
上面咱們提到了jquery的dom操做和模板引擎。若是程序員使用jquery或模板引擎來繪製頁面,那你必須同時關心前端頁面元素和後臺數據。有沒有一種技術,讓咱們像asp.net mvc同樣,只須要進行數據綁定,就能夠進行頁面顯示了。
PS:這裏個人描述不太清晰,個人目的是這樣的,我在cs文件中定義一個對象ViewBag.Num=1,我以頁面中能夠經過@ViewBag的形式將數字1顯示在頁面上。這就是我想表述的內容。
這就是一種mvc思想,也有人叫mvvm,可是我不想解釋得那麼複雜(主要是我不會)。讓數據的變化反應到頁面上,也讓頁面的變化反應到數據上。
<div id="el"> <input type="number" v-model="fir" />+ <input type="number" v-model="sec" />= <label>{{parseInt( this.fir)+ parseInt( this.sec)}}</label> </div> <script> // 建立一個Vue對象 它的構造函數是之樣的:new Vue(參數) // 只不過參數是一個對象而以。 new Vue({ el:"#el",// 指示Vue容器是一個id爲el的標籤 data:{fir:0,sec:0,result:0}// vue中用到的數據。 }); </script>
運行效果:
們把js代碼中data看作是mvc中的Model。把<div id='el'></div>
當作是視圖,這樣就完成了「雙向綁定」。
這就是一個簡單的vue示例,有沒有發現,咱們已經不用再使用「先獲取dom元素,再進行數據綁定」的方式來顯示數據了。
若是咱們把頁面切分紅兩部分。第一部分是<div id="el"></div>
。第二部分是data:{...}。那麼,完成能夠由兩個不一樣的人來未完成這兩個部分。它們之間沒有太多的耦合。烈軍屬data的人,只負責提供數據,不須要關心頁面展現。而寫頁面的人,只須要把「字段」展現到界面上,不須要關心這些字段是怎麼來的。
mvc中,還有一個很重要的部分,叫controller,在vue中,對應於methods和cumputed。
先來看metchods。
new Vue( { el:'#el', data:{fir:0,sec:0,result:0}, // 我定義了methods中包含元素,注意,methods不是我創造的,而是vue規定的 methods:{ // 定義一個名爲clickAdd的函數,這個函數用來把Model中的fir和sec相加, // 並把結果賦給Model中的result clickAdd:function(){this.result=this.fir+this.sec}, } } );
methods是一個元素,這個元素被定義在構造函數的輸入參數中。methods這個元素是一個對象,這個對象能夠包含0個或多個函數。像上面的代碼就包含了一個函數。接下來看看這個methods怎麼用。
按照上面所說的,咱們再寫一個頁面
<div id='el'> <input type="number" v-model="fir" />+ <input type="number" v-model="sec" /> <button type='button' onclick='showResult()'>=</button> <label>{{result}}</label> </div>
這樣寫完之後,瀏覽器會告訴你,showResult沒有定義。這裏須要注意,你寫在vue塊(我把<div id='el'></div>
所包含的代碼塊叫「vue塊「)中的屬性或值,必定要符合vue的風格。幸虧,咱們只須要記住兩種風格就能夠。
一般來講,咱們指定一個label的內容會是這樣:
<label>{{字段}}</label>
能夠看到,語法結構就是兩個大括號包含的一個字段名,這個字段必定要在data屬性中定義好。
new Vue({ el:'#el', data:{字段:'mol'} });
若是我要指定一個屬性,如點擊事件的屬性,我應該這樣作:
<label v-on:click="myClick()"></label>
固然,你非要使用onclick屬性來定義單擊事件的話,也無可厚非,只不過這樣的話,你就不能操做vue內部的對象了。
注意,v-on:click="myClick()"中的myClick這個函數必定要在methods中定義。
new Vue({ el:"#el", data:{}, methods:{ myClick:function(){ 這裏是你要作的動做 } } });
咱們都知道,控制一個元素是否顯示,能夠設計這個元素的style="display:值",值爲block時,顯示;值爲none時,元素不顯示。而在vue中,有一個屬性叫v-show,它也是控制元素是否顯示的。也就是說,下面兩句代碼的效果看起來是同樣的。
<div style="display:none;">我要想被隱藏</div> <div v-show="false">我也想要被隱藏</div>
之因此是「看起來是同樣的」,是由於:display:none的做用是,將dom元素的可見屬性設置爲none;而v-show="false"是根本不繪製這個dom元素。能夠經過查看網頁源碼來驗證我說的是否正確。
if和for就不用我解釋他們是幹什麼的了,直接上代碼:
<div v-if="myage<12">小學</div> <div v-else-if="myage<16">初中</div> <div v-else-if="myage<19">高中</div> <div v-else-if="myage<23">大學</div> <div v-else="">工做</div> <hr> <ul> <li v-for="p in team"> 姓名:{{p.name}}<br> 年齡:{{p.age}} </li> </ul> <script> var vueNode=new Vue({ el:"#app", data:{ myage:32, team:[{name:'mol',age:32},{name:'李老闆',age:33},{name:'囂張哥',age:34}]} }); </scrit>
能夠看到,vue的屬性都是以v-開頭。接下來,咱們體驗一下,vue的mvc思想及雙向綁定。
前面咱們已經經過for循環來展現了一個列表,它看起來像是這樣:
加li,應該怎麼作。
熟悉jquery的你,必定會說,先獲取到ul,再進行元素的添加,它看起來像是這樣:
$('ul').append('<li>姓名:小曾,年齡:奔三</li>');
這樣作徹底沒有問題。但這樣作有一個問題,就是前端和數據之間是「強耦合」的。咱們更但願有這樣兩個程序員,一我的寫後端(數據),另外一我的寫前端(頁面).而vue就能夠達到這樣的效果。
步驟1:前端人員寫頁面
<div id='el'> <ul> <li v-for="p in team"> 姓名:{{p.name}}<br> 年齡:{{p.age}} </li> </ul> <!--下面是讓用戶動態輸入信息的地方--> 姓名:<input type="text" v-model="newName" /> <br> 年齡:<input type="number" v-model="newAge" /> <br> <button v-on:click="addUser">添加</button> </div>
步驟2:後端人員寫數據
new Vue({ el:"#app", data:{ team:[{name:'mol',age:32},{name:'李老闆',age:33},{name:'囂張哥',age:34}], newName:'',newAge:'' }, methods:{ addUser:function(){ this.team.push({name:this.newName,age:this.newAge}); } } });
完事了!
看見木有?後端工程師只須要操做data中定義的數據就能夠了。當team數據發生變化時,頁面上的展現也相應地發生了變化,看起來像是這樣:
作爲一個.net出身的程序員來講,可能沒法理解,作爲一個「後端程序員」,怎麼可能簡單地寫幾行js就了事?再說了,js不該該是前端工程師的責任嗎? 首先,前端工程師的js廣泛沒有程序員的好;其次,js是一種很牛X的開發語言。如今有不少網站或應用均可以直接使用js來開發。我打算下次分享一個叫electro的技術。它就是用js來編寫應用的一種技術。