Commit e78771be authored by Sendya's avatar Sendya

fix: type

parent 74da9e46
...@@ -15,7 +15,7 @@ const DemoComponent = { ...@@ -15,7 +15,7 @@ const DemoComponent = {
state.toolbarProps = { ...state.toolbarProps, ...tProps }; state.toolbarProps = { ...state.toolbarProps, ...tProps };
}; };
const { state: routeContext, provider: RouteContextProvider } = createRouteContext({ const [ routeContext, RouteContextProvider ] = createRouteContext({
hasFooterToolbar: false, hasFooterToolbar: false,
setHasFooterToolbar: v => { setHasFooterToolbar: v => {
state.hasFooterToolbar = v; state.hasFooterToolbar = v;
...@@ -91,9 +91,9 @@ const DemoComponent = { ...@@ -91,9 +91,9 @@ const DemoComponent = {
<RouteContextProvider> <RouteContextProvider>
{routeContext.hasFooterToolbar && ( {routeContext.hasFooterToolbar && (
<FooterToolbar {...state.toolbarProps}> <FooterToolbar {...state.toolbarProps}>
<button key="button" type="button"> <Button type="primary">
right right
</button> </Button>
</FooterToolbar> </FooterToolbar>
)} )}
</RouteContextProvider> </RouteContextProvider>
......
import { createApp, defineComponent, reactive } from 'vue'; import { createApp, defineComponent, reactive } from 'vue';
import 'ant-design-vue/dist/antd.less'; import 'ant-design-vue/dist/antd.less';
import { Button, message } from 'ant-design-vue'; import { Button, message } from 'ant-design-vue';
import { default as ProLayout } from '../src/BasicLayout'; import { default as ProLayout } from '../src/';
import { menus } from './menus'; import { menus } from './menus';
import { useMenuState } from '../src/SiderMenu/BaseMenu'; import { useMenuState } from '../src/SiderMenu/BaseMenu';
import * as Icon from '@ant-design/icons-vue'; import * as Icon from '@ant-design/icons-vue';
...@@ -10,14 +10,14 @@ import { createRouteContext } from '../src/RouteContext'; ...@@ -10,14 +10,14 @@ import { createRouteContext } from '../src/RouteContext';
const BasicLayout = defineComponent({ const BasicLayout = defineComponent({
name: 'BasicLayout', name: 'BasicLayout',
inheritAttrs: false, inheritAttrs: false,
setup(_, { slots, attrs }) { setup(_, { attrs }) {
const [menuState] = useMenuState({ const [menuState] = useMenuState({
collapsed: false, collapsed: false,
openKeys: [], openKeys: [],
selectedKeys: ['/welcome'], selectedKeys: ['/welcome'],
}); });
const { state: routeContext, Provider: RouteContextProvider } = createRouteContext({ const [ routeContext, RouteContextProvider ] = createRouteContext({
isMobile: false, isMobile: false,
menuData: [], menuData: [],
sideWidth: 208, sideWidth: 208,
...@@ -35,6 +35,7 @@ const BasicLayout = defineComponent({ ...@@ -35,6 +35,7 @@ const BasicLayout = defineComponent({
title={'Pro Layout'} title={'Pro Layout'}
layout={'side'} layout={'side'}
theme={'dark'} theme={'dark'}
i18n={(key: string) => key}
isMobile={false} isMobile={false}
menuData={menus} menuData={menus}
matchMenuKeys={[]} matchMenuKeys={[]}
...@@ -83,4 +84,4 @@ Object.keys(Icon) ...@@ -83,4 +84,4 @@ Object.keys(Icon)
app.component(Icon[k].displayName, Icon[k]); app.component(Icon[k].displayName, Icon[k]);
}); });
app.use(BasicLayout).mount('#__vue-content>div'); app.use(ProLayout).mount('#__vue-content>div');
...@@ -10,7 +10,7 @@ import './index.less'; ...@@ -10,7 +10,7 @@ import './index.less';
const App = defineComponent({ const App = defineComponent({
name: 'App', name: 'App',
setup: function() { setup: function() {
const { state: routeContext, Provider: RouteContextProvider } = createRouteContext({ const [ routeContext, RouteContextProvider ] = createRouteContext({
hasSideMenu: true, hasSideMenu: true,
collapsed: true, collapsed: true,
isMobile: false, isMobile: false,
......
import { createApp, defineComponent, ref, reactive, toRaw, onMounted } from 'vue'; import { createApp, defineComponent, ref, reactive, toRaw, onMounted } from 'vue';
import { Card, Space, Button, Tag } from 'ant-design-vue'; import { Card, Space, Button } from 'ant-design-vue';
import { createRouteContext, useRouteContext } from '../src/RouteContext'; import { createRouteContext, useRouteContext } from '../src/RouteContext';
import 'ant-design-vue/dist/antd.less'; import 'ant-design-vue/dist/antd.less';
...@@ -10,10 +10,7 @@ const DemoComponent = { ...@@ -10,10 +10,7 @@ const DemoComponent = {
name: 'value', name: 'value',
}); });
const { const [ routeContext, RouteContextProvider ] = createRouteContext({
state: routeContext,
Provider: RouteContextProvider
} = createRouteContext({
hasSideMenu: true, hasSideMenu: true,
collapsed: true, collapsed: true,
isMobile: false, isMobile: false,
......
import './BasicLayoutTest.less'; import './BasicLayoutTest.less';
import './BasicLayout.less'; import './BasicLayout.less';
import { App, FunctionalComponent, CSSProperties } from 'vue'; import { App, FunctionalComponent, Plugin, CSSProperties } from 'vue';
import { Layout } from 'ant-design-vue'; import { Layout } from 'ant-design-vue';
import { MenuUnfoldOutlined, MenuFoldOutlined } from '@ant-design/icons-vue'; import { MenuUnfoldOutlined, MenuFoldOutlined } from '@ant-design/icons-vue';
...@@ -16,23 +16,21 @@ const defaultI18nRender = (key: string) => key; ...@@ -16,23 +16,21 @@ const defaultI18nRender = (key: string) => key;
export interface BasicLayoutProps { export interface BasicLayoutProps {
pure?: boolean; pure?: boolean;
/** /**
*@name logo url *@name logo url
*/ */
logo?: string | RenderVNodeType | WithFalse<string | RenderVNodeType>; logo?: string | RenderVNodeType | WithFalse<string | RenderVNodeType>;
loading?: boolean; loading?: boolean;
i18n: ProProviderData['i18n']; i18n?: ProProviderData['i18n'];
onCollapse?: (collapsed: boolean) => void; onCollapse?: (collapsed: boolean) => void;
footerRender?: WithFalse< footerRender?: WithFalse<
(props: any/* FooterProps */, defaultDom: RenderVNodeType) => RenderVNodeType (props: any /* FooterProps */, defaultDom: RenderVNodeType) => RenderVNodeType
>; >;
headerRender?: WithFalse< headerRender?: WithFalse<(props: any /* HeaderProps */) => RenderVNodeType>;
(props: any/* HeaderProps */) => RenderVNodeType
>;
/** /**
* 是否禁用移动端模式,有的管理系统不需要移动端模式,此属性设置为true即可 * 是否禁用移动端模式,有的管理系统不需要移动端模式,此属性设置为true即可
*/ */
...@@ -45,7 +43,8 @@ export interface BasicLayoutProps { ...@@ -45,7 +43,8 @@ export interface BasicLayoutProps {
disableContentMargin?: boolean; disableContentMargin?: boolean;
} }
export type ProLayoutProps = BasicLayoutProps & SiderMenuWrapperProps /* & HeaderProps & FooterProps */; export type ProLayoutProps = BasicLayoutProps &
SiderMenuWrapperProps /* & HeaderProps & FooterProps */;
const ProLayout: FunctionalComponent<ProLayoutProps> = (props, { emit, slots }) => { const ProLayout: FunctionalComponent<ProLayoutProps> = (props, { emit, slots }) => {
const handleClick = () => { const handleClick = () => {
...@@ -115,8 +114,12 @@ const ProLayout: FunctionalComponent<ProLayoutProps> = (props, { emit, slots }) ...@@ -115,8 +114,12 @@ const ProLayout: FunctionalComponent<ProLayoutProps> = (props, { emit, slots })
); );
}; };
ProLayout.install = function(app: App) { ProLayout.displayName = 'ProLayout';
ProLayout.emits = ['update:collapsed', 'update:openKeys', 'update:selectedKeys'];
// @ts-ignore
ProLayout.install = function (app: App) {
app.component('pro-layout', ProLayout); app.component('pro-layout', ProLayout);
}; }
export default ProLayout; export default ProLayout as typeof ProLayout & Plugin;
import { computed, defineComponent, onBeforeUnmount, onMounted, PropType, VNodeChild } from 'vue'; import { computed, defineComponent, onBeforeUnmount, onMounted, PropType, VNodeChild } from 'vue';
import { useProProvider } from '../ProProvider'; import { useProProvider } from '../ProProvider';
import { RouteContextProps, useRouteContext } from '../RouteContext'; import { RouteContextProps, useRouteContext } from '../RouteContext';
import { getComponent } from '../utils';
import './index.less'; import './index.less';
export interface FooterToolbarProps { export interface FooterToolbarProps {
...@@ -27,15 +28,11 @@ const FooterToolbarProps = { ...@@ -27,15 +28,11 @@ const FooterToolbarProps = {
const FooterToolbar = defineComponent({ const FooterToolbar = defineComponent({
name: 'FooterToolbar', name: 'FooterToolbar',
props: FooterToolbarProps, props: FooterToolbarProps,
setup(props, { slots }) { setup(props, ctx) {
const { slots } = ctx;
const { getPrefixCls } = useProProvider(); const { getPrefixCls } = useProProvider();
const baseClassName = props.prefixCls || getPrefixCls('footer-bar'); const baseClassName = props.prefixCls || getPrefixCls('footer-bar');
// const container = typeof props.getContainer === 'function' ? props.getContainer()
// const baseClassName = computed(() => {
// const prefixCls = props.prefixCls || getPrefixCls();
// return `${prefixCls}-footer-bar`;
// });
const routeContext = useRouteContext(); const routeContext = useRouteContext();
const width = computed(() => { const width = computed(() => {
const { hasSideMenu, isMobile, sideWidth } = routeContext; const { hasSideMenu, isMobile, sideWidth } = routeContext;
......
...@@ -125,7 +125,17 @@ const defaultPageHeaderRender = ( ...@@ -125,7 +125,17 @@ const defaultPageHeaderRender = (
props: PageContainerProps, props: PageContainerProps,
value: RouteContextProps & { prefixedClassName: string }, value: RouteContextProps & { prefixedClassName: string },
): VNodeChild | JSX.Element => { ): VNodeChild | JSX.Element => {
const { title, tabList, tabActiveKey, content, pageHeaderRender, header, extraContent, prefixCls, ...restProps } = props; const {
title,
tabList,
tabActiveKey,
content,
pageHeaderRender,
header,
extraContent,
prefixCls,
...restProps
} = props;
console.log('restProps', restProps); console.log('restProps', restProps);
console.log('routeContext.value', value); console.log('routeContext.value', value);
if (pageHeaderRender) { if (pageHeaderRender) {
......
...@@ -42,7 +42,7 @@ interface MenuStated { ...@@ -42,7 +42,7 @@ interface MenuStated {
openKeys: string[]; openKeys: string[];
} }
export type MenuStateWatched = [state: MenuStated, watchRef: WatchStopHandle] export type MenuStateWatched = [MenuStated, WatchStopHandle];
export function useMenuState({ export function useMenuState({
collapsed = false, collapsed = false,
...@@ -68,7 +68,7 @@ export function useMenuState({ ...@@ -68,7 +68,7 @@ export function useMenuState({
}, },
); );
return [state, watchRef] return [state, watchRef];
} }
export function useRootSubmenuKeys(menus: RouteProps[]): ComputedRef<string[]> { export function useRootSubmenuKeys(menus: RouteProps[]): ComputedRef<string[]> {
......
import './index.less'; import './index.less';
import { FunctionalComponent, computed, ref, VNodeChild } from 'vue'; import { FunctionalComponent, computed, ref } from 'vue';
// import 'ant-design-vue/es/layout/style'; // import 'ant-design-vue/es/layout/style';
// import Layout from 'ant-design-vue/es/layout'; // import Layout from 'ant-design-vue/es/layout';
...@@ -22,11 +22,7 @@ export interface SiderMenuProps ...@@ -22,11 +22,7 @@ export interface SiderMenuProps
siderWidth?: number; siderWidth?: number;
collapsedWidth?: number; collapsedWidth?: number;
menuHeaderRender?: WithFalse< menuHeaderRender?: WithFalse<
( (logo: RenderVNodeType, title: RenderVNodeType, props?: SiderMenuProps) => RenderVNodeType
logo: RenderVNodeType,
title: RenderVNodeType,
props?: SiderMenuProps,
) => RenderVNodeType
>; >;
menuFooterRender?: WithFalse<(props?: SiderMenuProps) => RenderVNodeType>; menuFooterRender?: WithFalse<(props?: SiderMenuProps) => RenderVNodeType>;
menuContentRender?: WithFalse< menuContentRender?: WithFalse<
...@@ -120,27 +116,28 @@ const SiderMenu: FunctionalComponent<SiderMenuProps> = (props: SiderMenuProps) = ...@@ -120,27 +116,28 @@ const SiderMenu: FunctionalComponent<SiderMenuProps> = (props: SiderMenuProps) =
// call menuHeaderRender // call menuHeaderRender
const headerDom = defaultRenderLogoAndTitle(props); const headerDom = defaultRenderLogoAndTitle(props);
const extraDom = menuExtraRender && menuExtraRender(props); const extraDom = menuExtraRender && menuExtraRender(props);
const defaultMenuDom = (<BaseMenu const defaultMenuDom = (
menus={menuData} <BaseMenu
theme={props.theme === 'realDark' ? 'dark' : props.theme} menus={menuData}
mode="inline" theme={props.theme === 'realDark' ? 'dark' : props.theme}
collapsed={props.collapsed} mode="inline"
openKeys={props.openKeys} collapsed={props.collapsed}
selectedKeys={props.selectedKeys} openKeys={props.openKeys}
style={{ selectedKeys={props.selectedKeys}
width: '100%', style={{
}} width: '100%',
class={`${baseClassName}-menu`} }}
{...{ class={`${baseClassName}-menu`}
'onUpdate:openKeys': $event => { {...{
onOpenChange($event); 'onUpdate:openKeys': $event => {
}, onOpenChange($event);
'onUpdate:selectedKeys': $event => { },
onSelect($event); 'onUpdate:selectedKeys': $event => {
}, onSelect($event);
}} },
/>); }}
/>
);
return ( return (
<> <>
...@@ -170,7 +167,7 @@ const SiderMenu: FunctionalComponent<SiderMenuProps> = (props: SiderMenuProps) = ...@@ -170,7 +167,7 @@ const SiderMenu: FunctionalComponent<SiderMenuProps> = (props: SiderMenuProps) =
</div> </div>
)} )}
<div style="flex: 1; overflow: hidden auto;"> <div style="flex: 1; overflow: hidden auto;">
{menuContentRender && menuContentRender(props, defaultMenuDom) || defaultMenuDom} {(menuContentRender && menuContentRender(props, defaultMenuDom)) || defaultMenuDom}
</div> </div>
<div class={`${baseClassName}-links`}> <div class={`${baseClassName}-links`}>
<Menu <Menu
...@@ -180,16 +177,16 @@ const SiderMenu: FunctionalComponent<SiderMenuProps> = (props: SiderMenuProps) = ...@@ -180,16 +177,16 @@ const SiderMenu: FunctionalComponent<SiderMenuProps> = (props: SiderMenuProps) =
selectedKeys={[]} selectedKeys={[]}
openKeys={[]} openKeys={[]}
mode="inline" mode="inline"
onClick={() => {
if (onCollapse) {
onCollapse(!props.collapsed);
}
}}
> >
<Menu.Item <Menu.Item
key={'collapsed-button'} key={'collapsed-button'}
class={`${baseClassName}-collapsed-button`} class={`${baseClassName}-collapsed-button`}
title={false} title={null}
onClick={() => {
if (onCollapse) {
onCollapse(!props.collapsed);
}
}}
> >
{collapsedButtonRender && collapsedButtonRender(collapsed)} {collapsedButtonRender && collapsedButtonRender(collapsed)}
</Menu.Item> </Menu.Item>
......
...@@ -5,7 +5,7 @@ import Drawer from 'ant-design-vue/es/drawer'; ...@@ -5,7 +5,7 @@ import Drawer from 'ant-design-vue/es/drawer';
import SiderMenu, { SiderMenuProps, PrivateSiderMenuProps } from './SiderMenu'; import SiderMenu, { SiderMenuProps, PrivateSiderMenuProps } from './SiderMenu';
export type SiderMenuWrapperProps = SiderMenuProps & PrivateSiderMenuProps; export type SiderMenuWrapperProps = SiderMenuProps & Partial<PrivateSiderMenuProps>;
const SiderMenuWrapper: FunctionalComponent<SiderMenuWrapperProps> = props => { const SiderMenuWrapper: FunctionalComponent<SiderMenuWrapperProps> = props => {
return props.isMobile ? ( return props.isMobile ? (
......
...@@ -9,21 +9,22 @@ import { ...@@ -9,21 +9,22 @@ import {
UnwrapRef, UnwrapRef,
VNode, VNode,
DefineComponent, DefineComponent,
toRaw,
} from 'vue'; } from 'vue';
export type ContextType<T> = any; export type ContextType<T> = any;
export interface CreateContext<T> { export type CreateContext<T> = [
Provider: DefineComponent<{}, () => VNode | VNode[] | undefined, any>; UnwrapRef<T> | T,
state: UnwrapRef<T> | T; DefineComponent<{}, () => VNode | VNode[] | undefined, any>,
} ];
export const createContext = <T>( export const createContext = <T>(
context: ContextType<T>, context: ContextType<T>,
contextInjectKey: InjectionKey<ContextType<T>> = Symbol(), contextInjectKey: InjectionKey<ContextType<T>> = Symbol(),
): CreateContext<T> => { ): CreateContext<T> => {
const state = reactive<ContextType<T>>({ const state = reactive<ContextType<T>>({
...context, ...toRaw(context),
}); });
const ContextProvider = defineComponent({ const ContextProvider = defineComponent({
...@@ -35,10 +36,7 @@ export const createContext = <T>( ...@@ -35,10 +36,7 @@ export const createContext = <T>(
}, },
}); });
return { return [state, ContextProvider];
state,
Provider: ContextProvider,
};
}; };
export const useContext = <T>( export const useContext = <T>(
...@@ -56,7 +54,7 @@ export const useContext = <T>( ...@@ -56,7 +54,7 @@ export const useContext = <T>(
// someData?: string[]; // someData?: string[];
// } // }
// //
// const { state, provider } = createContext<MyContextProps>({ // const [ state, ContextProvider ] = createContext<MyContextProps>({
// param1: 'abc', // param1: 'abc',
// param2: false, // param2: false,
// someData: ['a', 'b', 'c', 'd'] // someData: ['a', 'b', 'c', 'd']
......
import { WrapContent } from './WrapContent'; import { App, Plugin } from 'vue';
export { createContext, useContext, ContextType, CreateContext } from './hooks/context'; export { createContext, useContext, ContextType, CreateContext } from './hooks/context';
export { default as FooterToolbar } from './FooterToolbar'; export { default as FooterToolbar } from './FooterToolbar';
export { default as GlobalFooter } from './GlobalFooter'; export { default as GlobalFooter } from './GlobalFooter';
......
import { nextTick, h } from 'vue'; import { nextTick, h } from 'vue';
import { AbstractNode, IconDefinition } from '@ant-design/icons-svg/lib/types'; import { AbstractNode, IconDefinition } from '@ant-design/icons-svg/lib/types';
import { generate as generateColor } from '@ant-design/colors'; import { generate as generateColor } from '@ant-design/colors';
import insertCss from '../insert-css'; import { default as insertCss } from '../insert-css';
export { getComponent } from 'ant-design-vue/es/_util/props-util';
export { default as isUrl } from './isUrl'; export { default as isUrl } from './isUrl';
export { default as isImg } from './isImg'; export { default as isImg } from './isImg';
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment