"use strict";(self.webpackChunkfes_js=self.webpackChunkfes_js||[]).push([[475],{1783:(n,s,a)=>{a.r(s),a.d(s,{data:()=>e});const e={key:"v-355ee23e",path:"/reference/plugin/plugins/layout.html",title:"@fesjs/plugin-layout",lang:"zh-CN",frontmatter:{},excerpt:"",headers:[{level:2,title:"介绍",slug:"介绍",children:[]},{level:2,title:"启用方式",slug:"启用方式",children:[]},{level:2,title:"布局类型",slug:"布局类型",children:[{level:3,title:"side",slug:"side",children:[]},{level:3,title:"top",slug:"top",children:[]},{level:3,title:"mixin",slug:"mixin",children:[]},{level:3,title:"页面禁用布局",slug:"页面禁用布局",children:[]}]},{level:2,title:"keep-alive",slug:"keep-alive",children:[]},{level:2,title:"编译时配置",slug:"编译时配置",children:[{level:3,title:"footer",slug:"footer",children:[]},{level:3,title:"theme",slug:"theme",children:[]},{level:3,title:"navigation",slug:"navigation",children:[]},{level:3,title:"fixedHeader",slug:"fixedheader",children:[]},{level:3,title:"fixedSideBar",slug:"fixedsidebar",children:[]},{level:3,title:"title",slug:"title",children:[]},{level:3,title:"logo",slug:"logo",children:[]},{level:3,title:"multiTabs",slug:"multitabs",children:[]},{level:3,title:"menus",slug:"menus",children:[]},{level:3,title:"menusConfig",slug:"menusconfig",children:[]}]},{level:2,title:"运行时配置",slug:"运行时配置",children:[{level:3,title:"menus",slug:"menus-1",children:[]},{level:3,title:"header",slug:"header",children:[]},{level:3,title:"sidebar",slug:"sidebar",children:[]},{level:3,title:"logo",slug:"logo-1",children:[]},{level:3,title:"customHeader",slug:"customheader",children:[]},{level:3,title:"unAccessHandler",slug:"unaccesshandler",children:[]},{level:3,title:"noFoundHandler",slug:"nofoundhandler",children:[]},{level:3,title:"logoUrl",slug:"logourl",children:[]},{level:3,title:"其他运行时配置 (> 4.1.0)",slug:"其他运行时配置-4-1-0",children:[]}]}],filePathRelative:"reference/plugin/plugins/layout.md",git:{updatedTime:1664436338e3,contributors:[{name:"winixt",email:"haizekuo@gmail.com",commits:1}]}}},2891:(n,s,a)=>{a.r(s),a.d(s,{default:()=>wn});var e=a(6252);const p=(0,e._)("h1",{id:"fesjs-plugin-layout",tabindex:"-1"},[(0,e._)("a",{class:"header-anchor",href:"#fesjs-plugin-layout","aria-hidden":"true"},"#"),(0,e.Uk)(" @fesjs/plugin-layout")],-1),t=(0,e._)("h2",{id:"介绍",tabindex:"-1"},[(0,e._)("a",{class:"header-anchor",href:"#介绍","aria-hidden":"true"},"#"),(0,e.Uk)(" 介绍")],-1),l=(0,e._)("p",null,"为了进一步降低研发成本,我们尝试将布局通过 fes 插件的方式内置,只需通过简单的配置即可拥有布局,包括导航以及侧边栏。从而做到用户无需关心布局。",-1),o=(0,e.uE)("
侧边栏菜单数据根据路由中的配置自动生成。
布局,提供 side
、 top
、mixin
三种布局。
主题,提供 light
、dark
两种主题。
默认实现对路由的 404、403 处理。
在 package.json
中引入依赖:
{\n "dependencies": {\n "@fesjs/fes": "^2.0.0",\n "@fesjs/plugin-layout": "^4.0.0"\n },\n}\n
配置参数是 navigation
, 布局有三种类型 side
、mixin
和 top
, 默认是 side
:
export default {\n layout: {\n navigation: 'side'\n }\n}\n
布局是默认开启的,但是可能某些页面不需要展示布局样式,比如登录页面。我们只需要在页面的.vue
中添加如下配置:
<config lang="json">\n{\n "layout": false\n}\n</config>\n
如果只是不想展示sidebar
,则:
<config lang="json">\n{\n "layout": {\n "sidebar": false\n }\n}\n</config>\n
layout
的可选配置有:
sidebar: 左侧区域,从v4.0.0开始,之前名称叫side
header: 头部区域,从v4.0.0开始,之前名称叫top
logo:logo和标题区域。
从 4.0.7 开始支持配置路由页面缓存:
<config lang="json">\n{\n "keep-alive": true\n}\n</config>\n
在 .fes.js
中配置:
export default {\n layout: {\n // 标题\n title: "Fes.js",\n // 底部文字\n footer: 'Created by MumbleFE',\n // 主题light\n theme: 'dark'\n // 是否开启 tabs\n multiTabs: false,\n // 布局类型\n navigation: 'side',\n // 是否固定头部\n fixedHeader: false,\n // 是否固定sidebar\n fixedSideBar: true,\n // sidebar的宽度\n sideWidth: 200,\n menus: [{\n name: 'index'\n }, {\n name: 'onepiece'\n }, {\n name: 'store'\n }, {\n name: 'simpleList'\n }],\n menuConfig: {\n defaultExpandAll: false,\n expandedKeys: [],\n accordion: false\n }\n },\n
类型:String
默认值:null
详情:页面底部的文字。
类型:String
默认值:dark
详情:主题,可选有 dark
、light
类型:String
默认值:side
详情:页面布局类型,可选有 side
、 top
、 mixin
类型:Boolean
默认值:false
详情:是否固定头部,不跟随页面滚动。
类型:Boolean
默认值:true
详情:是否固定sidebar,不跟随页面滚动。
类型:String
默认值:name
in package.json
详情:产品名,会显示在 Logo 旁边。
类型:String
默认值:默认提供 fes.js 的 Logo
详情:Logo的链接
类型:boolean
默认值:false
详情:是否开启多页。
{\n path: '/product',\n match: ['/product/*', '/product/create']\n}\n
{\n icon: "AppstoreOutlined"\n}\n
- 图标使用本地或者远程svg图片。\n
{\n icon: "/wine-outline.svg"\n}\n
类型:Object
默认值:{}
详情:菜单的配置:
defaultExpandAll:是否默认展开全部菜单。
expandedKeys:配置默认展开的菜单,需要传子项是菜单路径的数组。
accordion:是否只保持一个子菜单的展开。
在 app.js
中配置:
import UserCenter from '@/components/UserCenter';\nexport const layout = {\n customHeader: <UserCenter />\n};\n\n
类型:(defaultMenus: [] )=> Ref | []
详情:运行时修改菜单,入参是默认菜单配置(.fes.js中的menu配置),需要返回一个Ref
或者数组。
import { ClusterOutlined } from '@fesjs/fes-design/icon'\nexport const layout = layoutConfig => ({\n ...layoutConfig,\n customHeader: <UserCenter />,\n menus: (defaultMenuData) => {\n const menusRef = ref(defaultMenuData);\n watch(() => layoutConfig.initialState.userName, () => {\n menusRef.value = [{\n name: 'store',\n icon: <ClusterOutlined />\n }];\n });\n return menusRef;\n }\n});\n\n
layoutConfig.initialState
是 beforeRender.action
执行后创建的应用初始状态数据。
如果菜单需要根据某些状态动态改变,则返回Ref
,否则只需要返回数组。
提示
在运行时配置菜单中的icon,需要传组件本身,而不是组件的名称。
类型:String
默认值:true
详情:是否显示 header 区域。
类型:String
默认值:true
详情:是否显示 sidebar 区域。
类型:String
默认值:true
详情:是否显示 logo 区域。
类型:Vue Component
默认值:null
详情:top的区域部分位置提供组件自定义功能。
类型:Function
默认值:null
详情:
当进入某个路由时,如果路由对应的页面不属于可见资源列表,则会暂停进入,调用 unAccessHandler
函数。
比如:
export const access = {\n unAccessHandler({ to, next }) {\n const accesssIds = accessApi.getAccess();\n if (to.path === '/404') {\n accessApi.setAccess(accesssIds.concat(['/404']));\n return next('/404');\n }\n if (!accesssIds.includes('/403')) {\n accessApi.setAccess(accesssIds.concat(['/403']));\n }\n next('/403');\n }\n};\n\n
类型:函数
默认值:null
详情:
当进入某个路由时,如果路由对应的页面不存在,则会调用 noFoundHandler
函数。
比如:
export const access = {\n noFoundHandler({ next }) {\n const accesssIds = accessApi.getAccess();\n if (!accesssIds.includes('/404')) {\n accessApi.setAccess(accesssIds.concat(['/404']));\n }\n next('/404');\n }\n};\n\n
类型:String
默认值:默认提供 fes.js 的 Logo
详情:Logo的链接。
编译时配置的内容同样支持在运行时配置,但是logo
除外,用logoUrl
替代。