20层的试炼html5,Vue.js-02:新手村的试炼 - 新世界的武器(指令)
一、前言
進入Vue.js的新世界,打怪升級,熟悉Vue.js的武器系統。菜鳥誕生的第二課,在新手村中熟悉Vue指令~~~
二、打怪升級
1、 v-cloak
在使用Vue的過程中,當我們引入了 vue.js 這個文件之后,瀏覽器的內存中就存在了一個 vue 對象,此時,我們就可以通過構造函數的方式創建出一個 vue 的對象實例,后面就可以對這個實例進行操作。
如果在這個過程中,對于 vue.js 的引用因為某些原因沒有加載完成,此時,未編譯的 Mustache 標簽就無法正常顯示。例如,在下面的例子中,我們模擬將網頁加載速度變慢,此時就可以看見,頁面最先開始會顯示出插值表達式,只有 vue.js 加載完成后,才會渲染成正確的數據。
1?
2?????{{msg}}
?3? ?4??5??6??7??8?????new?Vue({?9?????????el:?'#app',10?????????data:?{11?????????????msg:?'hello?world'12?????????}13?????});14?這時候,我們就可以使用v-cloak指令用于隱藏未編譯完成的插值表達式,一般我們在使用時會與添加一個隱藏該元素的樣式同時使用。
[v-cloak]?{
display:?none;
}
{{msg}}
大家可以看到,當頁面沒有顯示內容時,此時 p 標簽添加了一個 v-cloak 屬性,同時,從右側的樣式中可以看到,隱藏顯示,當加載完成后, p 標簽上去除了該屬性,同時插值表達式也編譯完成,正確顯示出來。
2、 v-text 與 v-html
v-text 與 v-html 指令都可以更新頁面元素的內容,不同的是,v-text 會將數據以字符串文本的形式更新,而 v-html 則是將數據以 html 標簽的形式更新。
在更新數據上,我們也可以使用差值表達式進行更新數據,不同于 v-text、v-html 指令,差值表達式只會更新原本占位插值所在的數據內容,而 v-text、v-html 指令則會替換掉整個的內容。
1?
2??3?????+++++++++?{{msg}}?-----------
?4?????=================
?5?????==============
?6??????7?????============
?8??9? 10?11?12?????new?Vue({13?????????el:?'#app',14?????????data:?{15?????????????msg:?'hello?world',16?????????????msgHtml:?'I?want?to?learn?vue.js
'17?????????}18?????});19?3、 v-bind
v-bind 可以用來在標簽上綁定標簽的屬性(例如:img 的 src、title 屬性等等)和樣式(可以用 style 的形式進行內聯樣式的綁定,也可以通過指定 class 的形式指定樣式)。同時,對于綁定的內容,是做為一個 js 變量,因此,我們可以對該內容進行編寫合法的 js 表達式。
在下面的示例中,我們將這個按鈕的 title 和 style 都是通過 v-bind 指令進行的綁定,這里對于樣式的綁定,我們需要構建一個對象,其它的對于樣式的綁定方法,我們將在后面的學習中提到。
1?
2??????6??????7??8??????9?????10? 11?12?13?new?Vue({14?????el:?'#app',15?????data:?{16?????????msgTitle:?'這是我自定義的title屬性',17?????????colorStyle:?'red',18?????????widthStyle:?'120'19?????}20?});21?效果示意圖如下所示
4、 v-on
在傳統的前端開發中,當我們想對一個按鈕綁定事件時,我們需要獲取到這個按鈕的 dom 元素,再對這個獲取到的 dom 進行事件的綁定。在我們學習 vue 的過程中,我們可以秉持一個思想,對于 dom 的操作,全部讓 vue 替我們完成,我們只關注業務代碼實現,因此,我們可以使用 vue 內置的 v-on 指令來替我們完成事件的綁定。
傳統的元素 js 寫法如下所示
//?傳統的事件綁定方法????document.getElementById('btn').?=?function?()?{
alert('傳統的事件綁定方法');
}
在使用 v-on 指令對事件進行綁定時,我們需要在標簽上指明 v-on:event(click、mousedown、mouseup 等等) 綁定的事件。
這樣就可以了嗎?我們可以測試下,哦吼,報錯了,vue 提醒我們屬性或者方法在 vue 實例中未定義,原來在 vue 的設計中許多事件處理邏輯會更為復雜,所以直接把 JavaScript 代碼寫在 v-on 指令中是不可行的。因此 v-on 還可以接收一個需要調用的方法名稱。所以,我們需要在 vue 實例的 methods 下寫出方法。
當然,使用 v-on 指令接收的方法名稱也可以傳遞參數,我們只需要在 methods 中定義方法時說明這個形參即可在方法中獲取到。
1??2??3??4??5??6?var?vm?=?new?Vue({?7?????el:?'#app',?8?????data:?{?9?????????msgTitle:?'這是我自定義的title屬性',10?????????colorStyle:?'red',11?????????widthStyle:?'120'12?????},13?????methods:?{//在?methods?中定義當前?vue?實例的所有可訪問方法14?????????handlerClick()?{15?????????????alert('我是使用?v-on?指令綁定的事件');16?????????},17??????????handlerClickWithParam(id)?{18?????????????alert('我是使用?v-on?指令綁定的事件,方法參數為'+id);19?????????}20?????}21?});
5、 v-model
在之前的學習中,對于數據的綁定,不管是使用插值表達式還是 v-text 指令,對于數據間的交互都是單向的,即只能將 vue 實例里的值傳遞給頁面,頁面對數據值的任何操作卻無法傳遞給 model。
例如,在下面的示例頁面中,我們手動將頁面的 h3 標簽里的內容進行修改,通過控制臺獲取到 vue 實例中的數據,發現數據并沒有發生變化。這里可以使用 window.vm 獲取到 vue 實例,則是因為我們之前引入 vue.js 后,會自動在瀏覽器內存中創建 vue 對象,我們通過構造函數創建的 vue 的實例也就存在與瀏覽器的內存里了。
{{?msg?}}
var?vm?=?new?Vue({
el:?'#app',
data:?{
msg:?'你好啊,hahaha'
}
});
MVVM中最重要的一個特性,可以說就是數據的雙向綁定,而 vue 作為一個 MVVM 框架,理所應當的實現了數據的雙向綁定,所以我們可以使用內置的 v-model 指令完成數據的在 View 與 Model 間的雙向綁定。
我們知道,只有表單元素可以與用戶進行交互,所以我們只能使用 v-model 指令在表單控件或者組件上創建雙向綁定。對于組件的雙向綁定,我們也會在后面的學習中提到。
{{?msg?}}
var?vm?=?new?Vue({
el:?'#app',
data:?{
msg:?'你好啊,程十六'
}
});
6、 v-if?與?v-show
v-if 與 v-show 指令都是根據表達式的真假值判斷元素的顯示與否。
在下面的代碼中,我們通過綁定一個按鈕的點擊事件,去修改 flag 值,從而做到對于兩個 h3 標簽的顯示與否的控制。
1?
2??????3??4?????我是通過?v-if?指令控制的~~~
?5?????我是通過?v-show?指令控制的~~~
?6? ?7??8??9?????var?vm?=?new?Vue({10?????????el:?'#app',11?????????data:?{12?????????????flag:?true13?????????},14?????????methods:?{15?????????????handlerClick()?{16?????????????????this.flag?=?!this.flag;17?????????????}18?????????}19?????});20?我們可以看到,flag 的初始值為 true,此時,兩個 h3 標簽都可以顯示出來,當我們點擊切換按鈕后,兩個 h3 都隱藏了,不同的是,我們可以看到,對于使用 v-if 指令控制的 h3 標簽,當表達式為 false 時,這個元素 dom 會直接銷毀并重建,而對于使用 v-show 指令控制的 h3 標簽,當表達式為 false 時,僅僅是將當前元素的 display CSS 屬性值設置為 none。所以,當我們需要頻繁控制元素的顯示與否時,推薦使用 v-show 指令,避免因為使用 v-if 指令而造成的高性能消耗。
7、 v-for
不管我們是寫 C# 還是寫 JAVA 或者是前端的 JavaScript 腳本,提到循環數據,首先都會想到 使用 for 循環,同樣的,在 vue 中,作者也為我們提供了 v-for 這一指令 用來循環數據。
在使用 v-for 指令時,我們可以對數組、對象、數字、字符串進行循環,獲取到源數據的每一個值。使用 v-for 指令,必須使用特定語法 alias in expression ,為當前遍歷的元素提供別名,這里類似于 C# 中的 foreach 的循環格式。
1?
2??????3?????數組索引值:?{{?index?}}?,?數據值:?{{?item?}}
?4? ?5??6??7?????var?vm?=?new?Vue({?8?????????el:?'#app',?9?????????data:?{10?????????????arrayList:?[12,?20,?34,?1,?6]11?????????}12?????});13?在 v-for 指令中,我們擁有對父作用域屬性的完全訪問權限。v-for 還支持一個可選的第二個參數為當前項的索引。在上面這個循環數組的代碼中,item 代表了數組中的每一項數據,index 則表示為當前項的索引,所以我們可以很方便的打印出數組中每一項數據和索引。同時,我們在 ul 標簽上綁定了一個 key 屬性,它可以為循環出來的每一項提供一個 key 值,我們可以理解成數據庫表中的每一條數據都有一個唯一的主鍵值,同樣的,我們需要保證這個 key 值要唯一對應著當前的數據項。
這里,采用循環數組對象的方式,來解釋這個 key 屬性要唯一的問題。
1?
2???????3??????4?????數組索引值:?{{?index?}}?,?id:?{{?item.id?}}?,?name:?{{?item.name?}}?,?age:?{{?item.age?}}
?5? ?6??7??8?????var?vm?=?new?Vue({?9?????????el:?'#app',10?????????data:?{11?????????????objList:?[12?????????????????????{id:?1,name:?'zhangsan',age:?23},13?????????????????????{id:?2,name:?'lisi',age:?32},14?????????????????????{id:?3,name:?'wangwu',age:?22},15?????????????????]16?????????}17?????});18?我們現在循環了一個對象數組,并在每一個數據項多的前面加了一個單選框,現在我們選中 {id: 2,name: 'lisi',age: 32} 這個數據對象,同時,使用控制臺往數組中添加新的元素。我們知道往一個數組中新增元素可以使用 push 方法或者是 unshift 方法,我們來嘗試一下。
我們看到當我們使用 push 方法在數組的最后添加一個數據時,之前單選框選擇的數據沒有發生更改,而當我們使用 unshift 方法在數組最前面添加一個數據時,單選框選擇的數據就發生了更改。這里就是因為 key 屬性綁定的是數組索引的緣故,我們選中的索引值是1,當在選中的數組元素前面添加數據時,原來選中的數組數據的索引值就會加一,所以最后就會選擇到別的元素。
這里我們就可以將 key 綁定為 item.id 這個屬性,這樣我們添加數據時就不會對選中的數據造成影響了,因為,我們已經告訴了程序,我們是根據 item.id 這個 key 值進行選中的,與數組的索引值無關。注意,這里如果我們添加的對象數據?id?還是3的話雖然可以添加成功,但是 vue 會給我們提示警告信息了,因為已經存在了一個?id?等于3的數據。
數組索引值:?{{?index?}}?,?id:?{{?item.id?}}?,?name:?{{?item.name?}}?,?age:?{{?item.age?}}
對于對象、數字、字符串的循環與對于數組的循環差不多,實現方法如下所示,大家可以自己編寫下試試。不過在遍歷對象時,是按 Object.keys() 的結果遍歷,但是不能保證它的結果在不同的 JavaScript 引擎下是一致的。
鍵名:?{{?key?}}?,?值:?{{?value?}}?,?索引值:?{{?index?}}
{{?item?}}
{{?item?}}
var?vm?=?new?Vue({
el:?'#app',
data:?{
obj:?{
id:?1,
name:?'chengshiliu',
age:?17
}
}
});
三、總結
這一章我們主要學習了一些 vue 中的內置指令,熟悉了它們的使用方法,本篇文章的全部的源碼都在文章開始處提供倉儲地址里,每一個文件的說明,可以查看 github 倉儲的 readme 說明,希望多多關注啊,嘻嘻。
總結
以上是生活随笔為你收集整理的20层的试炼html5,Vue.js-02:新手村的试炼 - 新世界的武器(指令)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [QT学习]-调色板|选择文件
- 下一篇: 【智能优化算法】改进的侏儒猫鼬优化算法(