有关vue项目布局,如何实现左右内容各自滚动自己的,table为空时候撑满高度

3 篇文章 0 订阅

 布局就是使用了ant design vue里面常用的布局ant design vue布局

1.想要实现左右侧各自滚动自己的,首先就应该让最大的盒子#app的overflow为hidden,这一步是防止页面内容超出后,浏览器页先出现了滚动条。

 再给左侧的菜单设置单独滚动

 

 菜单的设置很简单。主要难点在右侧,内容上。

2.在右侧内容的包裹布局上利用监测浏览器窗口变化,来影响内容区域的宽窄变化。(我有尝试过不监听,但是页面总是,扩大页面宽度时候,内容随之撑开,但是缩小的时候没有任何反应)。到底在那个盒子上加滚动才能实现呢。

 红色的部分可以理解成,已经完全通过监听浏览器窗口大小来计算出内容宽度了。等同于他现在就是浏览器窗口了。啥时候在这个框出现滚动条呢,当绿色盒子内的代码,不在随着屏幕缩小而改变了。红色盒子就会出现滚动条。所以要给小绿添加最小值。

.set-main-content {
  min-width: 920px;
  height: 100vh;
}

 到这布局的问题已经解决了,代码分享一下:

布局代码:


<template>
  <a-layout>
    <a-layout-sider
      v-model="collapsed"
      :trigger="null"
      collapsible
      class="app-sider"
    >
      <div class="logo-box"></div>
      <SideMenu :openCurrent="openCurrent" @clearPath="clearPath"></SideMenu>
    </a-layout-sider>
    <a-layout
      :style="'width:' + (fullWidth - 200) + 'px'"
      class="right-content-box"
    >
      <div class="set-main-content">
        <a-layout-header class="app-header" v-if="!showScreen">
          <span class="app-header-trigger">
            <a-icon
              class="trigger"
              :type="collapsed ? 'menu-unfold' : 'menu-fold'"
              @click="() => (collapsed = !collapsed)"
            />
          </span>
          <div class="app-header-right">
            <a-menu mode="horizontal" @click="handleClick">
              <a-menu-item key="/alarm/deviation" v-if="showModel[0]">
                <a-badge :count="count"><a-icon type="bell" /></a-badge>
              </a-menu-item>
              <a-sub-menu>
                <span class="app-user-avatar" slot="title">
                  <a-avatar
                    size="small"
                    src="https://gw.alipayobjects.com/zos/antfincdn/XAosXuNZyF/BiazfanxmamNRoxxVxka.png"
                  />
                  {{ User ? User.username : "" }}
                </span>
                <a-menu-item key="/setting/profile" v-if="showModel[1]"
                  ><a-icon type="user" key="user" />个人资料
                </a-menu-item>
                <a-menu-item key="/setting/password" v-if="showModel[2]"
                  ><a-icon type="lock" key="password" />修改密码
                </a-menu-item>
                <a-menu-item key="/login"
                  ><a-icon type="poweroff" />退出登录
                </a-menu-item>
              </a-sub-menu>
              <!-- <a-menu-item key="/help">
              <a-icon type="question-circle"
            /></a-menu-item> -->
            </a-menu>
          </div>
        </a-layout-header>
        <a-layout-content class="set-right-content">
          <template>
            <header-page v-if="haveHeader" :menuList="menuList"></header-page>
            <router-view />
          </template>
        </a-layout-content>
      </div>
    </a-layout>
  </a-layout>
</template>

<script>
import store from "@/store";
import { mapGetters } from "vuex";
import SideMenu from "../components/SideMenu";
export default {
  name: "Home",
  components: {
    SideMenu,
    HeaderPage,
  },
  data() {
    return {
      fullWidth: document.documentElement.clientWidth,
    };
  },
  mounted() {
    const that = this;
    window.onresize = () => {
      return (() => {
        window.fullWidth = document.documentElement.clientWidth;
        that.fullWidth = window.fullWidth;
      })();
    };
  },
</script>
<style scoped lang="less">
/deep/ .ant-layout {
  overflow: hidden;
}
/deep/ .container-tree {
  flex: 1;
  height: 100% !important;
}
.right-content-box {
  overflow-x: auto !important;
}
.set-main-content {
  min-width: 920px;
  height: 100vh;
}
</style>

左侧菜单的代码

<template>
  <a-menu
    theme="dark"
    mode="inline"
    :defaultSelectedKeys="[current]"
    :selectedKeys="[current]"
    @click="handleClick"
    @openChange="onOpenChange"
    :open-keys="openKeys"
    class="app-sider-menu"
  >
    <template v-for="item in this.routes[0].children">
      <a-sub-menu
        :key="item.path"
        v-if="item.visiable == 1 && item.children.length > 0"
      >
        <span slot="title">
          <icon-font
            :type="item.icon"
            v-if="item.icon && item.icon.indexOf('icon-') == 0"
          />
          <a-icon
            :type="item.icon"
            v-if="item.icon && item.icon.indexOf('icon-') == -1"
          />
          <span>{{ item.name }}</span>
        </span>
        <template v-for="menu in item.children">
          <a-menu-item :key="menu.path" v-if="menu.visiable == 1">{{
            menu.name
          }}</a-menu-item>
        </template>
      </a-sub-menu>
      <a-menu-item :key="item.path" v-else-if="item.visiable == 1">
        <icon-font
          :type="item.icon"
          v-if="item.icon && item.icon.indexOf('icon-') == 0"
        />
        <a-icon
          :type="item.icon"
          v-if="item.icon && item.icon.indexOf('icon-') == -1"
        />
        <span>{{ item.name }}</span>
      </a-menu-item>
    </template>
  </a-menu>
</template>

<script>
export default {
  name: "SideMenu",
  props: {
    openCurrent: {
      type: String,
    },
  },
  data() {
    return {
      current: this.$route.path,
      openKeys: ["/"],
      rootSubmenuKeys: [],
      flag: false,
    };
  },
  watch: {
    openCurrent: function (val, oldVal) {
      // 如果openCurrent改变就让他跳转
      this.flag = true;
      if (val.indexOf("alarm") > -1) {
        this.current = this.openCurrent;
        this.openKeys = ["/", "/alarms"];
        // 路由跳转
        this.$router.push(this.openCurrent);
      } else if (val.indexOf("setting") > -1) {
        this.current = this.openCurrent;
        this.openKeys = ["/", "/setting"];
        // 路由跳转
        this.$router.push(this.openCurrent);
      }
    },
  },
  computed: {
    // 使用对象展开运算符将 getter 混入 computed 对象中
    routes() {
      return [...this.$store.getters.routes];
    },
  },
  created() {
    this.setRootKey();
    // 从告警提示按钮跳转偏差告警页面
  },
  methods: {
    setRootKey() {
      // 获得新菜单
      var routes = this.$store.getters.routes;
      routes[0].children.forEach((element) => {
        this.rootSubmenuKeys.push(element.path);
      });
    },
    onOpenChange(openKeys) {
      // 最新的key值
      const latestOpenKey = openKeys.find(
        (key) => this.openKeys.indexOf(key) === -1
      );
      if (this.rootSubmenuKeys.indexOf(latestOpenKey) === -1) {
        this.openKeys = openKeys;
      } else {
        this.openKeys = latestOpenKey ? [latestOpenKey] : [];
      }
    },
    handleClick(e) {
      this.current = e.key;
      if (this.flag) {
        this.flag = false;
        this.$emit("clearPath");
      }
      if (e.key == "logout") {
        this.logout();
      } else {
        //如果key为路由则跳转
        if (e.key.indexOf("/") > -1) {
          this.$router.push(e.key);
        }
      }
    },
  },
  components: {},
};
</script>

<style lang="less" scoped>
.app-sider-menu {
  height: calc(100vh - 80px);
  overflow-x: hidden;
  overflow-y: auto;
}
.app-sider-menu::-webkit-scrollbar {
  display: none;
}
</style>

让table空的时候撑满高度

<a-table
      :rowKey="(record) => record.id"
      :columns="columns"
      :dataSource="tableData"
      :pagination="false"
      :loading="loading"
      bordered
      @change="onPageChanged"
      size="middle"
      :scroll="{ x: 'max-content' }"
      :class="tableData.length > 0 ? '' : 'when-empty-table'"
    >

就是价格判断如果当前没有数据,引入样式,这个给的高度是要自己算一下的。减去这个表格上面有的东西。

 .when-empty-table {
    .ant-table-placeholder {
      height: calc(100vh - 346px);
      min-height: 200px;
      display: flex;
      align-items: center;
      justify-content: center;
    }
     .ant-table-body {
      overflow-x: hidden !important;
    }
  }

最后分享一个小技巧,当拖动浏览器窗口缩着缩着,表格内容换行了,但是你不想让他换行,就可以下面这样不让他换行。然后捏

/deep/ .ant-table-body th,
/deep/ .ant-table-body td {
  text-align: center;
  white-space: nowrap;
}

 给表格添加一个横向滚动,重点是需要再加上一行

/deep/ .ant-table-body {
  overflow-x: auto !important;
}

上面这段css就是可以更好的替代ant design vue里面:scroll="{ x: 'max-content' }",因为这个scroll写法就相当于overflow-x:scroll,没超出的时候也会有个占位槽在那,不美观。

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值