4.1.9 • Published 10 months ago

ai-antdv-pro-layout v4.1.9

Weekly downloads
-
License
MIT
Repository
-
Last release
10 months ago

Ant Design Vue Pro Layout

Ant Design Pro Layout of Vue, easy to use pro scaffolding.

Vue Support NPM version NPM downloads License MIT

中文 | English

Install

npm i antdv-pro-layout

Simple Usage

First, you should add the antdv-pro-layout that you need into the library.

// main.[js|ts]
import { createApp } from "vue";
import App from "./App.vue";

import "ant-design-vue/dist/reset.css";
import Antd from "ant-design-vue";

import 'antdv-pro-layout/dist/style.css';
import { ProLayout, PageContainer } from "antdv-pro-layout";

const app = createApp(App);

app.use(Antd).use(ProLayout).use(PageContainer).mount("#app");

After that, you can use pro-layout in your Vue components as simply as this:

<template>
  <pro-layout
    :locale="locale"
    :menu-data="menuData"
    v-bind="layoutConf"
    v-model:openKeys="state.openKeys"
    v-model:collapsed="state.collapsed"
    v-model:selectedKeys="state.selectedKeys"
  >
    <router-view />
  </pro-layout>
</template>

<script setup lang="ts">
import { reactive, useRouter } from "vue";
import { getMenuData, clearMenuItem, type MenuDataItem } from "antdv-pro-layout";

const locale = (menuData: MenuDataItem) => menuData.meta?.title;
const router = useRouter();

const { menuData } = getMenuData(clearMenuItem(router.getRoutes()));

const state = reactive({
  collapsed: false, // default value
  openKeys: ["/dashboard"], // defualt openKeys
  selectedKeys: ["/welcome"], // default selectedKeys
});

const layoutConf = reactive({
  layout: "side",
  theme: "light", // "dark" | "light",
  menuTheme: "light", // "dark" | "light",
  fixedHeader: true,
  fixSiderbar: true,
  splitMenus: true,
});
</script>

API

Function Layout - ProLayout

  • MediaQueryEnum Screen size media query enumeration object
  • getMediaScreen Screen size
  • useMediaScreen Screen size ref responds to listening
  • PrefersColorSchemeEnum Media theme color mode enumeration object
  • getPrefersColorScheme Media Theme Color Mode Preferences
  • usePrefersColorScheme Media Theme Color Mode Preferences ref responds to listening
  • viewTransitionTheme Theme switching view transitions
  • getMenuData The routing table exits the system menu
  • clearMenuItem Clear menu item, property excluded !name and meta

Component Layout - ProLayout

PropertyDescriptionTypeDefault Value
titleText to the right of the layout LOGOstring'Ant Design Pro'
logoLayout Logo Linkstring-
logoStyleLayout Logo Styleobject-
loadingLayout content area loading waiting statusbooleanfalse
layoutMenu Layout'side' | 'top' | 'mix''side'
breadcrumbLayout content: Breadcrumbs in the upper left cornerObject-
themeGlobal Theme Colors'light' |'dark''light'
menuThemeMenu navigation theme color'light' |'dark''light'
menuDataMenu item data MenuDataItem[]Array[]
collapsedWhen the left side of the menu is closed and expandedbooleantrue
collapsedWidthCollapse width size on the left side of the menunumber48
siderWidthExpand width size on the left side of the menunumber200
selectedKeysChoose highlight keys from the menustring[][]
openKeysMenu select open expand keysstring[][]
fixSiderbarFixed list on left side of menubooleanfalse
splitMenusThe menu layout mix splits the secondary menu to the leftbooleanfalse
menuHeaderRenderRenders the header logo and header area of the menuv-slot | VNode | (props: BasicLayoutProps) => VNode | false-
menuHeaderExtraRenderRender menu header expands areav-slot | VNode | (props: BasicLayoutProps) => VNode | false-
menuFooterRenderRender the footer area of the menuv-slot | VNode | (props: BasicLayoutProps) => VNode | false-
menuItemRenderRender menu items Menu.Itemv-slot#menuItemRender="menuItem"-
menuSubItemRenderNested subitems of the render menu Menu.SubItemv-slot#menuSubItemRender="menuItem"-
collapsedButtonRenderThe render menu closes the button areav-slot#collapsedButtonRender="collapsed"-
fixedHeaderThe top area is fixedbooleanfalse
headerRenderRender the top areav-slot | VNode | (props: BasicLayoutProps) => VNode-
headerContentRenderRender the top content area, only the side layout worksv-slot | (props: BasicLayoutProps) => VNode-
headerContentRightRenderRenders the right area of the top contentv-slot | (props: BasicLayoutProps) => VNode-
footerRenderRender the bottom areav-slot | ({ width, ...props }) => VNodefalse
tabRenderRenders the top tab areav-slot | ({ width, ...props }) => VNodefalse
breadcrumbRenderRender the BREADCRUMB areav-slot | ({ route, params, routes, paths, h }) => VNode[]-
localeMenu name internationalization function processingFunction(menuDataItem?: MenuDataItem) => string | falsefalse
collapseThe left side of the menu folds up to expand the trigger function processingFunction(collapsed: boolean) => void-

Menu generation requires getMenuData and clearMenuItem function transformations For example: const { menuData } = getMenuData(clearMenuItem(routes))

Custom Render

headerContentRender
<template #headerContentRender>
  <div style="background-color: #ff7875">headerContentRender</div>
</template>
<template #headerContentRightRender>
  <a-avatar shape="square" size="small"> Avatar </a-avatar>
</template>
menuItemRender Menu.Item
<template #menuItemRender="{ path, meta }">
  <a-menu-item
    :key="path"
    :disabled="meta?.disabled"
    :danger="meta?.danger"
    :icon="meta?.icon"
  >
    <router-link :to="path">
      <span class="ant-pro-menu-item">
        <a-badge count="5" dot>
          <span class="ant-pro-menu-item-title">{{ meta?.title }}</span>
        </a-badge>
      </span>
    </router-link>
  </a-menu-item>
</template>
breadcrumbRender
<template #breadcrumbRender="{ route, params, routes }">
  <span v-if="routes.indexOf(route) === routes.length - 1">
    {{ route.breadcrumbName }}
  </span>
  <RouterLink v-else :to="{ path: route.path, params }">
    {{ route.breadcrumbName }}
  </RouterLink>
</template>
tabRender
<template #tabRender="{ width, fixedHeader }">
  <div>
    <header
      class="ant-layout-header"
      style="height: 36px; line-height: 36px; background: transparent"
      v-if="fixedHeader"
    ></header>
    <div
      :style="{
        margin: '0',
        height: '36px',
        lineHeight: '36px',
        right: '0px',
        top: '48px',
        position: fixedHeader ? 'fixed' : 'unset',
        width: fixedHeader ? width : '100%',
        overflow: 'hidden',
        zIndex: 14,
        padding: '4px 16px',
        background: '#fff',
        boxShadow: '0 1px 4px #0015291f',
        transition: 'background 0.3s, width 0.2s',
      }"
    >
      tabRender fixedHeader:{{ fixedHeader }} width:{{ width }}
    </div>
  </div>
</template>
footerRender
<template #footerRender="{ width, fixedHeader }">
  <div>
    <footer
      class="ant-layout-footer"
      style="height: 48px; line-height: 48px; background: transparent"
      v-if="fixedHeader"
    ></footer>
    <GlobalFooter
      :style="{
        margin: '0',
        height: '48px',
        lineHeight: '48px',
        right: '0px',
        bottom: '0px',
        position: fixedHeader ? 'fixed' : 'unset',
        width: fixedHeader ? width : '100%',
        overflow: 'hidden',
        zIndex: 14,
        background: '#fff',
        boxShadow: '0 1px 4px #0015291f',
        transition: 'background 0.3s, width 0.2s',
      }"
      :links="[
        {
          blankTarget: true,
          title: 'Link 1',
          href: '#',
        },
        {
          blankTarget: false,
          title: 'Link 2',
          href: 'https://gitee.com/TsMask/',
        },
        {
          blankTarget: true,
          title: 'Link 3',
          href: '#',
        },
      ]"
      copyright="Copyright &copy; 2023 Gitee For TsMask"
    >
    </GlobalFooter>
  </div>
</template>

Component Footer - GlobalFooter

PropertyDescriptionTypeDefault Value
linksRequired, link jumpArray<{ key?: string; title: string; href: string; blankTarget?: boolean; }>-
copyrightCopyright notice areav-slot | VNode | (props: BasicLayoutProps) => VNode | falseundefined
<GlobalFooter
  :links="[
    {
      blankTarget: true,
      title: 'Link 1',
      href: '#',
    },
    {
      blankTarget: false,
      title: 'Link 2',
      href: 'https://gitee.com/TsMask/',
    },
    {
      blankTarget: true,
      title: 'Link 3',
      href: '#',
    },
  ]"
  copyright="Copyright &copy; 2023 Gitee For TsMask"
></GlobalFooter>

Component content page - PageContainer

Contains the ANTDV component API attributes: PageHeaderAffix

PropertyDescriptionTypeDefault Value
loadingLoad statusbooleanfalse
flexThe content layout is full, with a default fixed width of 1200pxbooleanfalse
fixed-headerFix the page header to the topbooleanfalse
affixPropsConfiguration of fastenersaffix{offsetTop: 48}
pageFooterRender footer slotVNode | v-slot-
pageHeaderThe render header replaces the page header component slotVNode | v-slot-
...The PageHeader propertyPageHeader API-
breadcrumbPage header breadcrumb configuration, {} configuration is not displayedbreadcrumb-
contentPage header default slotVNode | v-slot-
contentExtraThe default slot space on the right side of the page headerVNode | v-slot-
tab-listPageheader footer slot no time to display the tag listArray<{key: string, tab: any}>-
tab-active-keyThe list of tags currently activates the keystring-
tab-changeTab list tab is a callback for being clicked(key) => void-
tab-propsTab list tab propertiestabs-

Basic Usage

Recommend look Examples or Use Template

Source Project Repository Branch

From @ant-design-vue/pro-layout

  • next : Vue3 + ant-design-vue@3.x (latest)
  • v3.1 : Vue3 + ant-design-vue@2.2.x (release LTS)
  • v2 : Vue2 + ant-design-vue@1.7.x

The version is still being updated v4

Continuous Maintenance

# Required dependencies for installation
npm install

# The packaged build dist directory contains the d.ts file
npm run build
4.1.9

10 months ago

4.1.8

10 months ago

4.1.7

10 months ago