查看 原文站點,更多擴展內容及更佳閱讀體驗!
數字輸入框只能輸入數字,並且有兩個快捷按鈕,能夠直接減1或加1。除此以外,還能夠設置初始值、最大/小值,在數值改變時,觸發一個自定義事件來通知父組件。css
目錄文件:html
index.html
入口頁input-number.js
數字輸入框組件index.js
根實例先在template
裏定義組件的根節點,由於是獨立組件,因此應該對每一個prop
進行校驗。git
接下來,先在父組件引入input-number
組件。github
value
是一個關鍵的綁定值,使用v-model
。大多數的表單組件都應該有一個v-model
,好比輸入框、單選框、多選框、下拉選擇器等。數組
Vue組件時單向數據流,沒法從組件內部直接修改prop value
的值。async
解決辦法是給組件聲明一個data
,默認引用value
的值,而後在組件內部維護這個data
。函數
Vue.component('input-number', { data() { return { currentValue: this.value } } });
這樣只解決了初始化時引用父組件value
的問題,可是若是從父組件修改了value
,input-number
組件的currentValue
也要一塊兒更新。this
監聽(watch
),watch
選項用來監聽某個prop
或data
的改變,當它們發生變化時,就會觸發watch
配置的函數,從而完成業務邏輯。代理
從父組件傳遞過來的value
可能不符合當前條件(大於max
,或小於min
),因此在methods
中寫了一個方法updateValue
,用來過濾出一個正確的currentValue
。code
watch
監聽的數據的回調函數有2個參數可用,第一個是新的值,第二個是舊的值。
在回調函數裏,this
指向當前組件實例。因此能夠直接調用this.updateValue()
,由於Vue代理了props
、data
、computed
及methods
。
監聽currentValue
的回調裏,this.$emit('input',val)
在使用v-model
時改變value
,this.$emit('on-change',val)
是觸發自定義事件on-change
,用於告知父組件數字輸入框的值有所變化。
在生命週期mounted
鉤子裏也調用了updateValue()
方法,是由於第一次初始化時,也對value
進行了過濾。
input
綁定了數據currentValue
和原生的change
事件,在句柄handleChange
函數中,判斷了當前輸入的是否時數字。
<p data-height="365" data-theme-id="0" data-slug-hash="oyzBWM" data-default-tab="html,result" data-user="whjin" data-embed-version="2" data-pen-title="Vue組件實例" class="codepen">See the Pen Vue組件實例 by whjin (@whjin) on CodePen.</p>
<script async src="https://static.codepen.io/ass...;></script>
每一個標籤頁的主體內容由使用組件的父級控制,這部分是一個slot
,並且slot
的數量決定標籤切換按鈕的數量。
文件目錄:
index.html
入口頁style.css
樣式表tabs.js
標籤頁外層的組件tabspane.js
標籤頁嵌套的組件panepane
須要控制標籤頁內容的顯示與隱藏,設置一個data:show
,而且用v-show
指令來控制元素。
getTabs
是一個公用的方法,使用this.$children
來取到全部的pane
組件實例。
在methods
中使用了有function
回調的方法時,在回調內的this
再也不執行當前的Vue實例,也就是tabs
組件自己,須要在外層設置一個_this=this
的局部變量來間接使用this
。
遍歷每個pane
組件後,把它的label
和name
提取出來,構成一個Object
並添加到數據navList
數組裏。
在使用v-for
指令循環顯示tab
標題時,使用v-bind:class
指向了一個名爲tabCls
的methods
來動態設置class
名稱。
點擊每一個tab
標題時,會觸發handleChange
方法來改變當前選中tab
的索引,也就是pane
組件的name
。在watch
選項中監聽了currentValue
,當其發生變化時,觸發updateStatus
方法來更新pane
組件的顯示狀態。
使用組件嵌套的方式,將一系列pane
組件做爲tabs
組件的slot
;tabs
組件和pane
組件通訊上,使用了$parent
和$children
的方法訪問父鏈和子鏈;定義了prop:value
和data:currentValue
,使用$emit('input')
來實現v-model
的用法。
<p data-height="365" data-theme-id="0" data-slug-hash="vrXWQw" data-default-tab="html,result" data-user="whjin" data-embed-version="2" data-pen-title="Vue-tabs" class="codepen">See the Pen Vue-tabs by whjin (@whjin) on CodePen.</p>
<script async src="https://static.codepen.io/ass...;></script>