Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
P
pro-layout
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
packages
pro-layout
Commits
2f9d0e8d
Commit
2f9d0e8d
authored
Mar 16, 2021
by
Sendya
Committed by
言肆
Mar 18, 2021
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix: remove route-context-provider in user used
parent
cdfcebd2
Changes
7
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
237 additions
and
194 deletions
+237
-194
index.tsx
examples/index.tsx
+40
-40
BasicLayout.tsx
src/BasicLayout.tsx
+160
-127
RouteContext.tsx
src/RouteContext.tsx
+14
-3
SiderMenu.tsx
src/SiderMenu/SiderMenu.tsx
+9
-3
WrapContent.tsx
src/WrapContent.tsx
+3
-3
index.ts
src/hooks/context/index.ts
+5
-12
index.ts
src/index.ts
+6
-6
No files found.
examples/index.tsx
View file @
2f9d0e8d
import
'ant-design-vue/dist/antd.less'
;
import
{
createApp
,
defineComponent
,
watch
,
ref
,
watchEffect
,
onMounted
}
from
'vue'
;
import
{
createApp
,
defineComponent
,
watch
,
ref
,
watchEffect
,
onMounted
,
reactive
}
from
'vue'
;
import
{
createRouter
,
createWebHashHistory
,
useRoute
,
useRouter
,
RouteRecord
}
from
'vue-router'
;
import
{
Avatar
}
from
'ant-design-vue'
;
import
{
UserOutlined
}
from
'@ant-design/icons-vue'
;
import
{
default
as
ProLayout
}
from
'../src/'
;
import
{
createRouteContext
}
from
'../src/RouteContext'
;
import
{
globalState
,
globalState
as
state
}
from
'./state'
;
import
{
globalState
as
state
}
from
'./state'
;
import
registerIcons
from
'./_util/icons'
;
...
...
@@ -26,12 +25,11 @@ const BasicLayout = defineComponent({
setup
()
{
const
{
getRoutes
}
=
useRouter
();
const
route
=
useRoute
();
const
[
RouteContextProvider
]
=
createRouteContext
();
const
menuData
=
getMenuData
(
getRoutes
());
state
.
menuData
=
menuData
;
const
updateSelectedMenu
=
()
=>
{
console
.
log
(
'updateSelectedMenu'
,
state
.
selectedKeys
);
const
matched
=
route
.
matched
.
concat
().
map
(
item
=>
item
.
path
);
matched
.
shift
();
state
.
selectedKeys
=
matched
;
...
...
@@ -63,16 +61,19 @@ const BasicLayout = defineComponent({
});
return
()
=>
(
<
RouteContextProvider
value=
{
state
}
>
<
ProLayout
i18n=
{
(
key
:
string
)
=>
key
}
layout=
{
state
.
layout
}
navTheme=
{
state
.
navTheme
}
i18n=
{
(
key
:
string
)
=>
key
}
isMobile=
{
state
.
isMobile
}
fixSiderbar=
{
state
.
fixSiderbar
}
fixedHeader=
{
state
.
fixedHeader
}
contentWidth=
{
'Fixed'
}
primaryColor=
{
'#1890ff'
}
contentStyle=
{
{
minHeight
:
'300px'
}
}
siderWidth=
{
state
.
sideWidth
}
splitMenus=
{
state
.
splitMenus
}
menuData=
{
menuData
}
collapsed=
{
state
.
collapsed
}
openKeys=
{
state
.
openKeys
}
selectedKeys=
{
state
.
selectedKeys
}
...
...
@@ -97,7 +98,6 @@ const BasicLayout = defineComponent({
>
<
router
-
view
/>
</
ProLayout
>
</
RouteContextProvider
>
);
},
});
...
...
src/BasicLayout.tsx
View file @
2f9d0e8d
import
{
computed
,
FunctionalComponent
,
CSSProperties
,
unref
}
from
'vue'
;
import
{
computed
,
FunctionalComponent
,
CSSProperties
,
reactive
,
unref
,
provide
,
defineComponent
,
}
from
'vue'
;
import
'ant-design-vue/es/layout/style'
;
import
Layout
from
'ant-design-vue/es/layout'
;
import
{
withInstall
}
from
'ant-design-vue/es/_util/type'
;
import
{
default
as
ProProvider
,
ProProviderData
}
from
'./ProProvider
'
;
import
RouteContext
,
{
RouteContextProps
}
from
'./RouteContext
'
;
import
{
default
as
SiderMenuWrapper
,
SiderMenuWrapperProps
}
from
'./SiderMenu'
;
import
{
WrapContent
}
from
'./WrapContent'
;
import
{
default
as
Header
,
HeaderViewProps
}
from
'./Header'
;
...
...
@@ -11,6 +19,8 @@ import { getCustomRender, PropRenderType, PropTypes } from './utils';
import
useMediaQuery
from
'./hooks/useMediaQuery'
;
import
'./BasicLayout.less'
;
export
const
defaultPrefixCls
=
'ant-pro'
;
const
defaultI18nRender
=
(
key
:
string
)
=>
key
;
export
type
BasicLayoutProps
=
SiderMenuWrapperProps
&
...
...
@@ -23,7 +33,7 @@ export type BasicLayoutProps = SiderMenuWrapperProps &
loading
?:
boolean
;
i18n
?:
ProProviderData
[
'i18n'
];
i18n
?:
RouteContextProps
[
'i18n'
];
defaultCollapsed
?:
boolean
;
...
...
@@ -48,7 +58,8 @@ export type BasicLayoutProps = SiderMenuWrapperProps &
disableContentMargin
?:
boolean
;
};
const
ProLayout
:
FunctionalComponent
<
BasicLayoutProps
>
=
(
props
,
{
emit
,
slots
})
=>
{
const
ProLayout
=
defineComponent
({
setup
(
props
:
BasicLayoutProps
,
{
emit
,
slots
})
{
const
{
onCollapse
:
propsOnCollapse
,
onOpenKeys
:
propsOnOpenKeys
,
...
...
@@ -66,6 +77,7 @@ const ProLayout: FunctionalComponent<BasicLayoutProps> = (props, { emit, slots }
const
isTop
=
computed
(()
=>
layout
===
'top'
);
// const isSide = computed(() => layout === 'side');
// const isMix = computed(() => layout === 'mix');
const
pure
=
computed
(()
=>
props
.
pure
);
// if on event and @event
const
onCollapse
=
(
propsOnCollapse
&&
propsOnCollapse
)
||
...
...
@@ -143,9 +155,25 @@ const ProLayout: FunctionalComponent<BasicLayoutProps> = (props, { emit, slots }
matchMenuKeys
,
);
return
(
<
ProProvider
i18n=
{
defaultI18nRender
}
>
{
props
.
pure
?
(
const
routeContext
:
RouteContextProps
=
{
getPrefixCls
:
(
suffixCls
?:
string
,
customizePrefixCls
?:
string
)
=>
{
if
(
customizePrefixCls
)
return
customizePrefixCls
;
return
suffixCls
?
`
${
defaultPrefixCls
}
-
${
suffixCls
}
`
:
defaultPrefixCls
;
},
i18n
:
(
t
:
string
):
string
=>
t
,
contentWidth
:
'Fluid'
,
menuData
,
selectedKeys
:
props
.
selectedKeys
||
[],
openKeys
:
props
.
openKeys
||
[],
};
console
.
log
(
'BasicLayout.routeContext'
,
routeContext
);
console
.
log
(
'pure'
,
pure
.
value
);
provide
(
'route-context'
,
routeContext
);
return
()
=>
(
<>
{
pure
.
value
?
(
slots
.
default
?.()
)
:
(
<
div
class=
{
className
.
value
}
>
...
...
@@ -173,9 +201,10 @@ const ProLayout: FunctionalComponent<BasicLayoutProps> = (props, { emit, slots }
</
Layout
>
</
div
>
)
}
</
ProProvider
>
</
>
);
};
},
});
ProLayout
.
inheritAttrs
=
false
;
ProLayout
.
displayName
=
'ProLayout'
;
...
...
@@ -237,10 +266,6 @@ ProLayout.props = {
fixedHeader
:
PropTypes
.
bool
,
/* 触发响应式布局的断点 https://ant.design/components/grid-cn/#Col */
breakpoint
:
PropTypes
.
string
.
def
(
'lg'
),
/* 关于 menu 的配置,暂时只有 locale,locale 可以关闭 menu 的自带的全球化 */
menu
:
PropTypes
.
object
,
/* 传递到 antd menu 组件的 props */
menuProps
:
PropTypes
.
object
,
/* 使用 IconFont 的图标配置 */
iconfontUrl
:
PropTypes
.
string
,
/* 当前 layout 的语言设置 */
...
...
@@ -250,8 +275,16 @@ ProLayout.props = {
siderWidth
:
PropTypes
.
number
.
def
(
208
),
/* 侧边栏收起宽度 */
collapsedWidth
:
PropTypes
.
number
.
def
(
48
),
/* 关于 menu 的配置,暂时只有 locale,locale 可以关闭 menu 的自带的全球化 */
menu
:
PropTypes
.
object
,
/* 传递到 antd menu 组件的 props */
menuProps
:
PropTypes
.
object
,
/* 菜单数组 */
menuData
:
PropTypes
.
object
,
/* 是否分割菜单 (仅 mix 模式有效) */
splitMenus
:
PropTypes
.
bool
,
selectedKeys
:
PropTypes
.
array
,
openKeys
:
PropTypes
.
array
,
/* 控制菜单的收起和展开 */
collapsed
:
PropTypes
.
bool
,
/* 菜单的折叠收起事件 (collapsed: boolean) => void */
...
...
src/RouteContext.tsx
View file @
2f9d0e8d
...
...
@@ -34,6 +34,9 @@ export interface MenuState {
}
export
interface
RouteContextProps
extends
Partial
<
PureSettings
>
,
MenuState
{
getPrefixCls
:
(
suffixCls
?:
string
,
customizePrefixCls
?:
string
)
=>
string
;
i18n
:
(
t
:
string
)
=>
string
;
breadcrumb
?:
BreadcrumbListReturn
;
menuData
?:
MenuDataItem
[];
isMobile
?:
boolean
;
...
...
@@ -49,8 +52,16 @@ export interface RouteContextProps extends Partial<PureSettings>, MenuState {
[
key
:
string
]:
any
;
}
const
routeContextInjectKey
:
InjectionKey
<
RouteContextProps
>
=
Symbol
();
const
routeContextInjectKey
:
InjectionKey
<
RouteContextProps
>
=
Symbol
(
'route-context'
);
export
const
createRouteContext
=
()
=>
createContext
<
RouteContextProps
>
(
routeContextInjectKey
,
'RouteContext.Provider'
);
export
const
useRouteContext
=
()
=>
useContext
<
RouteContextProps
>
(
'route-context'
/* routeContextInjectKey */
);
export
const
createRouteContext
=
()
=>
createContext
<
RouteContextProps
>
(
routeContextInjectKey
);
const
Provider
=
createRouteContext
(
);
export
const
useRouteContext
=
()
=>
useContext
<
RouteContextProps
>
(
routeContextInjectKey
);
export
default
{
Provider
,
};
src/SiderMenu/SiderMenu.tsx
View file @
2f9d0e8d
import
{
FunctionalComponent
,
computed
}
from
'vue'
;
import
{
FunctionalComponent
,
computed
,
watch
}
from
'vue'
;
import
'ant-design-vue/es/layout/style'
;
import
Layout
from
'ant-design-vue/es/layout'
;
import
'ant-design-vue/es/menu/style'
;
...
...
@@ -7,7 +7,6 @@ import BaseMenu, { BaseMenuProps } from './BaseMenu';
import
{
WithFalse
,
VNodeType
}
from
'../typings'
;
import
{
SiderProps
}
from
'./typings'
;
import
{
MenuUnfoldOutlined
,
MenuFoldOutlined
}
from
'@ant-design/icons-vue'
;
import
{
useProProvider
}
from
'../ProProvider'
;
import
{
useRouteContext
}
from
'../RouteContext'
;
import
{
getMenuFirstChildren
}
from
'../utils'
;
import
'./index.less'
;
...
...
@@ -98,9 +97,10 @@ const SiderMenu: FunctionalComponent<SiderMenuProps> = (props: SiderMenuProps) =
onOpenKeys
,
onSelect
,
}
=
props
;
const
{
getPrefixCls
}
=
useProProvider
();
const
context
=
useRouteContext
();
const
{
getPrefixCls
}
=
context
;
const
baseClassName
=
getPrefixCls
(
'sider'
);
console
.
log
(
'useRouteContext'
,
context
);
// const isMix = computed(() => props.layout === 'mix');
// const fixed = computed(() => context.fixSiderbar);
const
runtimeTheme
=
computed
(()
=>
(
props
.
layout
===
'mix'
&&
'light'
)
||
props
.
navTheme
);
...
...
@@ -125,6 +125,12 @@ const SiderMenu: FunctionalComponent<SiderMenuProps> = (props: SiderMenuProps) =
if
(
hasSide
.
value
&&
flatMenuData
.
value
.
length
===
0
)
{
return
null
;
}
watch
(
()
=>
context
.
selectedKeys
,
n
=>
{
console
.
log
(
'watch:context'
,
n
);
},
);
const
defaultMenuDom
=
(
<
BaseMenu
prefixCls=
{
getPrefixCls
()
}
...
...
src/WrapContent.tsx
View file @
2f9d0e8d
import
{
FunctionalComponent
,
computed
,
toRefs
,
CSSProperties
}
from
'vue'
;
import
'ant-design-vue/es/layout/style'
;
import
Layout
from
'ant-design-vue/es/layout'
;
import
{
use
ProProvider
}
from
'./ProProvider
'
;
import
{
ContentWidth
}
from
'./typings'
;
import
{
use
RouteContext
}
from
'./RouteContext
'
;
import
type
{
ContentWidth
}
from
'./typings'
;
const
{
Content
}
=
Layout
;
...
...
@@ -16,7 +16,7 @@ export interface WrapContentProps {
}
export
const
WrapContent
:
FunctionalComponent
<
WrapContentProps
>
=
(
props
,
{
slots
,
attrs
})
=>
{
const
{
getPrefixCls
}
=
toRefs
(
use
ProProvider
());
const
{
getPrefixCls
}
=
toRefs
(
use
RouteContext
());
const
prefixCls
=
getPrefixCls
.
value
(
'basicLayout'
);
const
classNames
=
computed
(()
=>
{
return
{
...
...
src/hooks/context/index.ts
View file @
2f9d0e8d
...
...
@@ -12,21 +12,14 @@ import {
export
type
ContextType
<
T
>
=
any
;
export
type
CreateContext
<
T
>
=
[
// UnwrapRef<T> | T,
DefineComponent
<
{},
()
=>
VNode
|
VNode
[]
|
undefined
,
any
>
,
];
export
type
CreateContext
<
T
>
=
DefineComponent
<
{},
()
=>
VNode
|
VNode
[]
|
undefined
,
any
>
;
export
const
createContext
=
<
T
>
(
// context: ContextType<T>,
contextInjectKey
:
InjectionKey
<
ContextType
<
T
>>
=
Symbol
(),
injectCompName
:
string
=
'Context.Provider'
,
):
CreateContext
<
T
>
=>
{
// const state = reactive<ContextType<T>>({
// ...toRaw(context),
// });
const
ContextProvider
=
defineComponent
({
name
:
'ContextProvider'
,
name
:
injectCompName
,
props
:
{
value
:
{
type
:
Object
as
PropType
<
ContextType
<
T
>>
,
...
...
@@ -39,11 +32,11 @@ export const createContext = <T>(
},
});
return
[
ContextProvider
]
;
return
ContextProvider
;
};
export
const
useContext
=
<
T
>
(
contextInjectKey
:
InjectionKey
<
ContextType
<
T
>>
=
Symbol
(),
contextInjectKey
:
string
|
InjectionKey
<
ContextType
<
T
>>
=
Symbol
(),
defaultValue
?:
ContextType
<
T
>
,
):
T
=>
{
return
inject
(
contextInjectKey
,
defaultValue
||
({}
as
T
));
...
...
src/index.ts
View file @
2f9d0e8d
...
...
@@ -4,12 +4,12 @@ export { default as FooterToolbar } from './FooterToolbar';
export
{
default
as
GlobalFooter
}
from
'./GlobalFooter'
;
export
{
default
as
GridContent
}
from
'./GridContent'
;
export
{
WrapContent
}
from
'./WrapContent'
;
export
{
default
as
ProProvider
,
defaultProProviderProps
,
useProProvider
,
ProProviderData
,
}
from
'./ProProvider'
;
//
export {
//
default as ProProvider,
//
defaultProProviderProps,
//
useProProvider,
//
ProProviderData,
//
} from './ProProvider';
export
{
PageContainer
}
from
'./PageContainer'
;
export
{
default
as
SiderMenuWrapper
,
SiderMenuWrapperProps
}
from
'./SiderMenu/index'
;
export
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment