簡書原文javascript
這是我作了第二個單文件元件
第一個在這裏vCheckBoxhtml
此次這個叫vTabs,用於操做標籤頁
演示DEMO
演示DEMO2 - 子組件模式及別名
演示DEMO3 - 極簡模式java
htmlgit
<div id="tabs2"></div> <div id="tab-1">1</div> <div id="tab-2">2</div> <div id="tab-3">3</div>
jsgithub
var tabs2 = new vTabs({ el: "#tabs2", data: { tabs: [ { text: "html", el: "#tab-1" }, { text: "javascript", el: "#tab-2" }, { text: "其餘", disabled: true, el: "#tab-3" } ] } });
設計部分幾乎和vCheckBox一毛同樣:dom
template
供後期拓展props
保證在子組件時的可用changed
事件stateChanged
,tabAdded
,tabRemoved
尚不可用)惟一比較特別的地方就是能夠使用極簡模式this
watch: { tabs: function(value) { if (value == null) { this.tabs = []; return; } if (value.constructor !== Array) { this.tabs = [value]; return; } var id = this.tabFields.id, el = this.tabFields.el, text = this.tabFields.text, disabled = this.tabFields.disabled; function set(obj, name, value) { if (typeof name === "string") Vue.set(obj, name, value); return obj; } for (var i = 0; i < value.length; i++) { var val = value[i]; if (typeof val !== "object") { val = set({}, text, val); } if (!val.hasOwnProperty(id)) { set(val, id, Math.random().toString()); } if (!val.hasOwnProperty(disabled)) { set(val, disabled, false); } if (val.hasOwnProperty(el) && typeof val[el] === "string") { set(val, el, document.querySelector(val[el])); } value[i] = val; } if (value.length === 0) { if (this.selectedIndex !== -1) { this.selectedIndex = -1; } } else if (this.selectedIndex < 0 || this.selectedIndex >= value.length) { this.selectedIndex = 0; } },
觀察(watch)tabs
的變化,若是隻是string
就做爲text使用,其餘屬性若是不存在即補全。
因爲初始化data
時並不會觸發watch,因此在created
中嘗試觸發watch.net
created: function() { this.tabs = [].concat(this.tabs); },
GitHub設計
說明文檔過兩天有時間再補,順便吧那3個事件一塊兒實現了,最近睡眠驗證不足,睡覺了。。。code