Vue 单文件元件 — vTabs

这是我做了第二个单文件元件
第一个在这里vCheckBox

这次这个叫vTabs,用于操作标签页
演示DEMO
演示DEMO2 - 子组件模式及别名
演示DEMO3 - 极简模式

示例:

html

<div id="tabs2"></div>
<div id="tab-1">1</div>
<div id="tab-2">2</div>
<div id="tab-3">3</div>

js

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一毛一样:

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

唯一比较特别的地方就是可以使用极简模式

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

created: function() {
  this.tabs = [].concat(this.tabs);
},

源码

GitHub

说明文档过两天有时间再补,顺便吧那3个事件一起实现了,最近睡眠验证不足,睡觉了。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,990评论 25 709
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,267评论 4 61
  • 以夼
    悟通阅读 142评论 0 0
  • 终于飞到了南京,呆在喜欢的人身边。 1怎么有人能让你如此喜欢 我大概是喜欢南京,因为我姐在南京。 喜欢一个城市各有...
    宁静Ning阅读 292评论 0 0
  • 【人类图】6-59亲密的通道 从荐骨能量中心到情绪能量中心的通道 也就是6号闸门通往59号闸门的这一条能量管道被定...
    幸福滋养生态艺术阅读 7,445评论 2 1