若是想顯示{{}}標籤,而不進行替換 使用 v-pre便可跳 過這個元素和 它的子元素的 編譯過程,
例如:javascript
<span v-pre >{{這裏的內容是不會被編譯的門}}</ span>
<div id=」 app」 > { { date | formatDate ) ) </div> var app =new Vue({ el : ’ #app ’ , data: { date : new Date() filters : { formatDate : function (value) { //這裏的 value 就是須要過濾的數據 } })
過濾器也能夠串聯,並且能夠接收參數,例如:css
<! 一串聯一〉 { { message | filterA | filterB } } 〈!一接收參數一一〉 {{ message | flterA ('argl ’,’ arg2 ’)}}
這裏的字符argl arg2 將分別傳給過濾器的第 2個和第 3個參數,由於第1 個是數據自己。html
**過濾器應當用於處理簡單的文本轉換,若是要實現更爲複雜的數據變換,應該使用計
算屬性;**vue
既然使用 methods 就能夠實現,那麼爲何還須要計算屬性呢?緣由就是
計算屬性是基於它的依賴緩存的。 一個計算屬性所依賴的數據發生變化時,它纔會從新取值,因此
text 只要不改變,計算屬性也就不更新java
<div :class=」{’ active ’: isActive }」></div> <div : class=」 [isActive ? activeCls :'', errorCls] 」 ></div> <div :style ={’ color ’: color, ’ fontSize ’ : fontSize +’ px ’}」〉文本</ div>
[v-cloak] { display: none; } <div id=」 app 」 v-cloak> {{message )) </div>
通常狀況下,v-cloak是一 個解決初始化慢致使頁面閃動的最佳實踐,對於簡單的項目很實
用,可是在具備工程化的項目裏,好比後面進階篇將介紹 webpack和 vue-router 時,項目的 HTML
結構只有一 個空的 div 元素,剩餘的內容都是由路由去掛載不一樣組件完成的,因此再也不須要 v-cloak。webpack
可使用 Vue提供的 key 屬性,它可讓你本身決定是否要複用元
素, key 的值必須是惟 一的:web
<div id=」 app」> <template v-if=」type ===’ name ’」> <label >用戶名 </ label> <input placeholder=」輸入用戶名」 key=" name-input」> </template> <template v-else> <label >郵箱 </ label> <input placeholder=」輸入郵箱」 key=唄ail-input 」〉 </template> <button @click=」 handleToggleClick 」〉切換輸入類型</button> </div>
給兩個<input>元素都增長 key後 就不會複用了,切換類型時鍵入的內容也會被刪除,不過
<label>元素仍然是被複用的,由於沒有添加 key 屬性。vue-router
Vue 包含了一 組觀察數組變異的方法,使用它們改變數組也會觸
發視圖更新:數組
須要注意的是,如下變更的數組中, Vue 是不能檢測到的,也不會觸發視圖更新:瀏覽器
解決第一 個問題能夠用兩種方法實現一樣的效果,第 種是使用 Vue 內置的 set 方法:
Vue .set(app.books, 3 , { name: 《css 揭祕》 ’, author :’[希] Lea Verou ’ }
若是是在 webpack 中使用組件化的方式(進階篇中將介紹〉,默認是沒有導入 Vue 的,這時
可使用$set ,例如:
this.$set(app.books, 3 , { name: ’《css 揭祕》’, author :’[希] Lea Verou ’ })
第二個問題也能夠直接用 splice 來解決:
app.books.splice(l);
在methods中 定義了咱們 須要的方法供@click 調用, 須要注意 ,@click 調用的方法名後能夠不跟括號「()」 此時,若是該方法有參數,默認會將原生事件對象 event 傳入,能夠嘗試修改成@click=」handleAdd」,而後在 handleAdd 內打印出 count 參數看看。在大部分業務場景中,若是方法不須要傳入參數,爲了簡即可以不寫括號。
Vue 提供了 個特殊變量$event ,用於訪問原生 DOM 事件,例以下面的實例能夠阻止連接打開:
<div id=」 app 」 > <a href=」http:llwww.apple.com」@click="handleClick ('禁止打開’,$event )」>打開連接 </a> </div> <script> var app =new Vue({ el :’#app ’, methods: { handleClick : function (message, event) { event . preventDefault() ; window . alert(message); } } })
例如:
<! -- Shift + S --> <input @keyup.shift . 83=」handleSave 」> <!-- Ctrl + Click --> <div @click.ctrl=」doSomething」>Do something</div>
組件與之相似,須要註冊後纔可使用。註冊有全局註冊和局部註冊兩種方式。全局註冊後,
任何 Vue 實例均可以使用。全局註冊示例代碼以下
Vue.component (’ my- component ’, { //選項 })
Vue組件的模板在某些狀況下會受到 HTML 的限制,好比<table>內規定只容許是〈tr〉<td>、<
th>等這些表格元素,因此在<tabl >內直接使用組件是無效的 這種狀況下,可使用特殊的**is
屬性**來掛載組件 示例代碼以下
<div id=」 app」 > <table> <tbody is=」my-component」 ></tbody> </ table> </div>
<script> Vue.component ( ’ my-component ’, { template :’ div >這裏是組件的內容</ div> }) ; var app =new Vue({ el : ’ #app ’ }) <script />
tbody 在渲染時 會被替換爲組件的內容。常見的限制元素還有<ul>、<ol>、<select>
JavaScript 對象是引用關係,因此若是 return出的對象引用了外部對象, 那這個對象就
是共享的,任何 方修改都會同步。好比下面的示例:
<div id=」 app」 > <my- component></my-component> <my-component></my-component> <my-component></my-component> </div> <script> var data = { counter : 0 } Vue.component (’ my- component ’, { template :’<button @click=」 counter++」 >{{ counter ) )</button>’, data:function () { return data ; } }) var app =new Vue ( { el :’#app ’ }) </script>
組件使用了3次 可是點擊任意一 <button>。3 個數字都會加1 ,那是 由於組件 data
用的是外部 的對象,這確定不是咱們指望的效果,因此 給組件返回一個新的 data對 象來獨立
例代碼以下
<div id=」 app」 > <my- component></my-component> <my-component></my-component> <my-component></my-component> </div> <script> Vue.component (’ my- component ’, { template :’<button @click=」 counter++」 >{{ counter ) )</button>’, data:function () { return { counter:0 } } }) var app =new Vue ( { el :’#app ’ }) </script>
這樣,點擊3 個按鈕就互不影響了,徹底達到複用的目的。
**注意,若是你要直接傳遞數字、布爾值、數組、對象,並且不使用 v-bind
,傳遞的僅
僅是字符串,嘗試下面的示例來對比:**
<div id=」 app 」 > <my-component message=」 [ 1 , 2, 3 ] 」 ></my-component> <my-component :message=」 [ 1 , 2, 3 ] 」 ></my-component> </div> <script> Vue.component (’ my-component ’, { props: [ ’ message ’ ], template :’<div>{{ message.length }}</div>’ } ) var app =new Vue ( { el : ’ #app ’ }) </script>
同一個組件使用了兩次,區別僅僅是第二個使用的是 v-bind
,渲染後的結果,第一個是7
,第二個纔是數組的長度 3,
Vue.component my-component ’, props : { //必須是數字類型 propA : Number, //必須是字符串或數字類型 propB : [String, Number] , //布爾值,若是沒有定義,默認值就是 true propC: { type : Boolean , default : true //數字,並且是必傳 } propD: { type: Number , required : true //若是是數組或對象,默認值必須是一個函數來返回 } propE: { type : Array , default : function () { return [] ; //自定義 個驗證函數 } } propF: { validator : function (value) { return value > 10; } } } )};
type 類型能夠是:
type也能夠是一 個自定義構造器,使用 instanceof 檢測。
當prop 驗證失敗時,在開發版本下會在控制檯拋出一 條警告。
子組件用 $emit()
來觸發事件,父組件用$on()
來
監昕子組件的事件
推薦使用一個空的 Vue 實例做爲中央事件總線( bus ),也就是一箇中介
var bus= new Vue (); methods : { handleEvent: function () { bus.$emit(’on-message',' 來自組件 mponent-a 的內容') } } //在實例初始化時,監聽來自 bus 實例的事件 bus.$on (’on-message ’, function (msg) { ...})
$refs 只是在組件 渲染完成後才填充,而且它是非響應式的 它僅僅做爲一個直接訪問子
苦? 組件的應急方案,應當避免在模板或計算屬性中使用$refs
<div id=」 app」 > <div id div v-if=氣howDiv 〉這是一段文本</ div> <button @click= getText 〉獲取 div 內容</button> </div> <script> var app =new Vue({ el :’#app ’, data: { showDiv: false }, methods : { getText: function () { this.showDiv = true; var text = document .getElementByid (’ div ’) .innerHTML; console . log(text) ; } } }) </script>
這段代碼並不難理解,可是運行後在控制檯會拋出一個錯誤: Cannot read prope町’innerHU.伍’
of null ,意思就是獲取不到 div 元素。這裏就涉及 Vue 一個重要的概念:異步更新隊列。
Vue 會根據當前瀏覽器環境優先使用原生的 Promise.then MutationObserver ,若是都不支持,
就會採用 setTimeout代替。
<div id=」 app」 > <div id div v-if=氣howDiv 〉這是一段文本</ div> <button @click= getText 〉獲取 div 內容</button> </div> <script> var app =new Vue({ el :’#app ’, data: { showDiv: false }, methods : { getText: function () { this.showDiv = true ; this.$nextTick (function () { var text = document . getElementByid ( ’ div ’) . innerHTML; console.log(text) ; } } }) </script>
這時再點擊按鈕,控制檯就打印出 div 的內容「這是一段文本」了。
咱們應該不用去主動操做 DOM,由於 Vue 的核心思想就是數據驅動 DOM,但在很
多業務裏,咱們避免不了會使用 些第三方庫,好比 popper.js、 swiper等 ,這些基於原生 JavaScript 庫都有建立和更新及銷燬的完整生命週期,與 Vue 合使用時,就要利用好$nextTick
咱們如今所建立的實例都是經過 new Vue()的形式建立出來的 。在一些很是特殊的狀況下,我
們須要動態地去建立 Vue 實例, Vue 提供了 Vue.extend和 $mount 兩個方法來手動掛載一個實例。
Vue.extend是 基礎 Vue 構造器,建立一個「子類」,參數是一 個包含組件選項的對象。
若是 Vue 實例在實例化時沒有收到 el 選項,它就處於「未掛載」狀態,沒有關聯的 DOM元
素。可使用$mount()手動地掛載一 個未掛載的實例。這個方法返回實例自身,於是能夠鏈式調用
其餘實例方法。示例代碼以下:
<div id=」 unt-div 」〉 </div> <script> var MyComponent =Vue.extend (( template :’<div>Hello: {{ ne } }</div>’, data: function () { return ( name :’Aresn ’ ., } ) new MyComponent ().$mount (’#mount-div ’);
另一種掛載方式
new MyComponent ({ el :’#mount-div ’ });
//或者,在文檔以外渲染而且隨後掛載
var component= new MyComponent() . $mount (); document.getElementByid ('mount-d ’) .appendChild(component.$el);
手動掛載實例(組件)是一 種比較極端的高級用法,在業務中幾乎用不到,只在開發一 些復
雜的獨立組件時可能會使用,因此只作瞭解就好。
//全局註冊 Vue.directive(’focus ’,{ //指令選項 ., } ) //局部註冊 var app =new Vue({ el :’#app ’, directive: { focus: { //指令選項 })
自定義指令的選項是由幾個鉤子函數組成的,每一個都是可選的。
時執行一次的初始化動做.
的綁定值,能夠忽略沒必要要的模板更新。