• SpringBlade 标签页


    代码位置



    代码说明(一部分)

    <template>
    
      <!-- tag 标签页容器 -->
      <div class="avue-tags"
           v-if="showTag">
    
        <!-- 右键菜单 -->
        <div v-if="contextmenuFlag"
             class="avue-tags__contentmenu"
             :style="{left:contentmenuX+'px',top:contentmenuY+'px'}">
          <!-- 关闭其他 -->
          <div class="item"
               @click="closeOthersTags">{{$t('tagsView.closeOthers')}}</div>
          <!-- 关闭所有 -->
          <div class="item"
               @click="closeAllTags">{{$t('tagsView.closeAll')}}</div>
        </div>
    
    
        <!-- 首页是否可被关闭,读取 config/website.js 中的 isFirstPage 属性来判断 -->
        <div class="avue-tags__box"
             :class="{'avue-tags__box--close':!website.isFirstPage}">
    
          <!-- 标签页必须留一个,在closable中判断的 -->
          <el-tabs v-model="active"
                   type="card"
                   @contextmenu.native="handleContextmenu"
                   :closable="tagLen!==1"
                   @tab-click="openTag"
                   @edit="menuTag">
    
            <!-- 遍历tagList,生成标签页 -->
            <el-tab-pane :key="item.value"
                         v-for="item in tagList"
                         :label="generateTitle(item)"
                         :name="item.value">
            </el-tab-pane>
          </el-tabs>
    
    
          <!-- 这里感觉好像没用给 -->
          <el-dropdown class="avue-tags__menu">
            <el-button type="primary"
                       size="mini">
              {{$t('tagsView.menu')}}
              <i class="el-icon-arrow-down el-icon--right"></i>
            </el-button>
            <el-dropdown-menu slot="dropdown">
              <el-dropdown-item @click.native="closeOthersTags">{{$t('tagsView.closeOthers')}}</el-dropdown-item>
              <el-dropdown-item @click.native="closeAllTags">{{$t('tagsView.closeAll')}}</el-dropdown-item>
            </el-dropdown-menu>
          </el-dropdown>
    
        </div>
    
      </div>
    </template>
    <script>
    import { mapGetters, mapState } from "vuex";
    export default {
      name: "tags",
      data() {
        return {
          active: "",
          contentmenuX: "",
          contentmenuY: "",
          contextmenuFlag: false
        };
      },
      created() {},
      mounted() {
        this.setActive();
      },
      watch: {
        tag() {
          this.setActive();
        },
        contextmenuFlag() {
          window.addEventListener("mousedown", this.watchContextmenu);
        }
      },
      computed: {
        ...mapGetters(["tagWel", "tagList", "tag", "website"]),
        ...mapState({
          showTag: state => state.common.showTag
        }),
        tagLen() {
          return this.tagList.length || 0;
        }
      },
      methods: {
        generateTitle(item) {
          //这里的数据是:标签页的标题数据
          //不知道为什么这里的数据被执行了两次
          return this.$router.$avueRouter.generateTitle(
            item.label,
            (item.meta || {}).i18n
          );
        },
        watchContextmenu(event) {
          if (!this.$el.contains(event.target) || event.button !== 0) {
            this.contextmenuFlag = false;
          }
          window.removeEventListener("mousedown", this.watchContextmenu);
        },
        handleContextmenu(event) {
          let target = event.target;
          // 解决 https://github.com/d2-projects/d2-admin/issues/54
          let flag = false;
          if (target.className.indexOf("el-tabs__item") > -1) flag = true;
          else if (target.parentNode.className.indexOf("el-tabs__item") > -1) {
            target = target.parentNode;
            flag = true;
          }
          if (flag) {
            event.preventDefault();
            event.stopPropagation();
            this.contentmenuX = event.clientX;
            this.contentmenuY = event.clientY;
            this.tagName = target.getAttribute("aria-controls").slice(5);
            this.contextmenuFlag = true;
          }
        },
        //激活当前选项
        setActive() {
          this.active = this.tag.value;
        },
        menuTag(value, action) {
          if (action === "remove") {
            let { tag, key } = this.findTag(value);
            this.$store.commit("DEL_TAG", tag);
            if (tag.value === this.tag.value) {
              tag = this.tagList[key === 0 ? key : key - 1]; //如果关闭本标签让前推一个
              this.openTag(tag);
            }
          }
        },
        openTag(item) {
          let tag;
          if (item.name) {
            tag = this.findTag(item.name).tag;
          } else {
            tag = item;
          }
          this.$router.push({
            path: this.$router.$avueRouter.getPath({
              name: tag.label,
              src: tag.value,
              i18n: tag.meta.i18n
            }),
            query: tag.query
          });
        },
        closeOthersTags() {
          this.contextmenuFlag = false;
          this.$store.commit("DEL_TAG_OTHER");
        },
        findTag(value) {
          let tag, key;
          this.tagList.map((item, index) => {
            if (item.value === value) {
              tag = item;
              key = index;
            }
          });
          return { tag: tag, key: key };
        },
        closeAllTags() {
          this.contextmenuFlag = false;
          this.$store.commit("DEL_ALL_TAG");
          this.$router.push({
            path: this.$router.$avueRouter.getPath({
              src: this.tagWel.value
            }),
            query: this.tagWel.query
          });
        }
      }
    };
    </script>
    
    
    
    
  • 相关阅读:
    ajax发送请求
    Canvas与SVG的区别
    jquery中attr()和prop()方法的区别
    ab(Apache Benchmark)测试工具的安装
    Nginx与阻塞操作
    构造函数调用顺序
    对一个类求sizeof,虚继承
    代码清单16-4 服务器压力测试程序
    libevent源码分析-TCP服务端代码
    Linux内核源码之红黑树
  • 原文地址:https://www.cnblogs.com/guxingy/p/13497035.html
Copyright © 2020-2023  润新知