Vue 单文件元件 — vTabs

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

  1. 提供template供后期拓展
  2. 处理props保证在子组件时的可用
  3. 全部样式内联,保证单文件可用
  4. 提供事件支持(目前仅实现了changed事件stateChangedtabAddedtabRemoved尚不可用)

惟一比较特别的地方就是能够使用极简模式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

相关文章
相关标签/搜索