简书原文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