Commit 2f9d0e8d authored by Sendya's avatar Sendya Committed by 言肆

fix: remove route-context-provider in user used

parent cdfcebd2
import 'ant-design-vue/dist/antd.less'; 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 { createRouter, createWebHashHistory, useRoute, useRouter, RouteRecord } from 'vue-router';
import { Avatar } from 'ant-design-vue'; import { Avatar } from 'ant-design-vue';
import { UserOutlined } from '@ant-design/icons-vue'; import { UserOutlined } from '@ant-design/icons-vue';
import { default as ProLayout } from '../src/'; import { default as ProLayout } from '../src/';
import { createRouteContext } from '../src/RouteContext'; import { globalState as state } from './state';
import { globalState, globalState as state } from './state';
import registerIcons from './_util/icons'; import registerIcons from './_util/icons';
...@@ -26,12 +25,11 @@ const BasicLayout = defineComponent({ ...@@ -26,12 +25,11 @@ const BasicLayout = defineComponent({
setup() { setup() {
const { getRoutes } = useRouter(); const { getRoutes } = useRouter();
const route = useRoute(); const route = useRoute();
const [RouteContextProvider] = createRouteContext();
const menuData = getMenuData(getRoutes()); const menuData = getMenuData(getRoutes());
state.menuData = menuData;
const updateSelectedMenu = () => { const updateSelectedMenu = () => {
console.log('updateSelectedMenu', state.selectedKeys);
const matched = route.matched.concat().map(item => item.path); const matched = route.matched.concat().map(item => item.path);
matched.shift(); matched.shift();
state.selectedKeys = matched; state.selectedKeys = matched;
...@@ -63,41 +61,43 @@ const BasicLayout = defineComponent({ ...@@ -63,41 +61,43 @@ const BasicLayout = defineComponent({
}); });
return () => ( return () => (
<RouteContextProvider value={state}> <ProLayout
<ProLayout layout={state.layout}
i18n={(key: string) => key} navTheme={state.navTheme}
layout={state.layout} i18n={(key: string) => key}
navTheme={state.navTheme} isMobile={state.isMobile}
contentWidth={'Fixed'} fixSiderbar={state.fixSiderbar}
primaryColor={'#1890ff'} fixedHeader={state.fixedHeader}
contentStyle={{ minHeight: '300px' }} contentWidth={'Fixed'}
siderWidth={state.sideWidth} primaryColor={'#1890ff'}
splitMenus={state.splitMenus} contentStyle={{ minHeight: '300px' }}
collapsed={state.collapsed} siderWidth={state.sideWidth}
openKeys={state.openKeys} splitMenus={state.splitMenus}
selectedKeys={state.selectedKeys} menuData={menuData}
{...{ collapsed={state.collapsed}
'onUpdate:collapsed': $event => (state.collapsed = $event), openKeys={state.openKeys}
'onUpdate:openKeys': $event => (state.openKeys = $event), selectedKeys={state.selectedKeys}
'onUpdate:selectedKeys': updateSelectedMenu, {...{
}} 'onUpdate:collapsed': $event => (state.collapsed = $event),
v-slots={{ 'onUpdate:openKeys': $event => (state.openKeys = $event),
rightContentRender: () => ( 'onUpdate:selectedKeys': updateSelectedMenu,
<div style={{ marginRight: '16px' }}> }}
<Avatar icon={<UserOutlined />} /> Sendya v-slots={{
</div> rightContentRender: () => (
), <div style={{ marginRight: '16px' }}>
menuHeaderRender: () => ( <Avatar icon={<UserOutlined />} /> Sendya
<a> </div>
<img src="https://gw.alipayobjects.com/zos/antfincdn/PmY%24TNNDBI/logo.svg" /> ),
{state.collapsed && state.layout !== 'mix' ? null : <h1>Pro Preview</h1>} menuHeaderRender: () => (
</a> <a>
), <img src="https://gw.alipayobjects.com/zos/antfincdn/PmY%24TNNDBI/logo.svg" />
}} {state.collapsed && state.layout !== 'mix' ? null : <h1>Pro Preview</h1>}
> </a>
<router-view /> ),
</ProLayout> }}
</RouteContextProvider> >
<router-view />
</ProLayout>
); );
}, },
}); });
......
This diff is collapsed.
...@@ -34,6 +34,9 @@ export interface MenuState { ...@@ -34,6 +34,9 @@ export interface MenuState {
} }
export interface RouteContextProps extends Partial<PureSettings>, MenuState { export interface RouteContextProps extends Partial<PureSettings>, MenuState {
getPrefixCls: (suffixCls?: string, customizePrefixCls?: string) => string;
i18n: (t: string) => string;
breadcrumb?: BreadcrumbListReturn; breadcrumb?: BreadcrumbListReturn;
menuData?: MenuDataItem[]; menuData?: MenuDataItem[];
isMobile?: boolean; isMobile?: boolean;
...@@ -49,8 +52,16 @@ export interface RouteContextProps extends Partial<PureSettings>, MenuState { ...@@ -49,8 +52,16 @@ export interface RouteContextProps extends Partial<PureSettings>, MenuState {
[key: string]: any; [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,
};
import { FunctionalComponent, computed } from 'vue'; import { FunctionalComponent, computed, watch } 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';
import 'ant-design-vue/es/menu/style'; import 'ant-design-vue/es/menu/style';
...@@ -7,7 +7,6 @@ import BaseMenu, { BaseMenuProps } from './BaseMenu'; ...@@ -7,7 +7,6 @@ import BaseMenu, { BaseMenuProps } from './BaseMenu';
import { WithFalse, VNodeType } from '../typings'; import { WithFalse, VNodeType } from '../typings';
import { SiderProps } from './typings'; import { SiderProps } from './typings';
import { MenuUnfoldOutlined, MenuFoldOutlined } from '@ant-design/icons-vue'; import { MenuUnfoldOutlined, MenuFoldOutlined } from '@ant-design/icons-vue';
import { useProProvider } from '../ProProvider';
import { useRouteContext } from '../RouteContext'; import { useRouteContext } from '../RouteContext';
import { getMenuFirstChildren } from '../utils'; import { getMenuFirstChildren } from '../utils';
import './index.less'; import './index.less';
...@@ -98,9 +97,10 @@ const SiderMenu: FunctionalComponent<SiderMenuProps> = (props: SiderMenuProps) = ...@@ -98,9 +97,10 @@ const SiderMenu: FunctionalComponent<SiderMenuProps> = (props: SiderMenuProps) =
onOpenKeys, onOpenKeys,
onSelect, onSelect,
} = props; } = props;
const { getPrefixCls } = useProProvider();
const context = useRouteContext(); const context = useRouteContext();
const { getPrefixCls } = context;
const baseClassName = getPrefixCls('sider'); const baseClassName = getPrefixCls('sider');
console.log('useRouteContext', context);
// const isMix = computed(() => props.layout === 'mix'); // const isMix = computed(() => props.layout === 'mix');
// const fixed = computed(() => context.fixSiderbar); // const fixed = computed(() => context.fixSiderbar);
const runtimeTheme = computed(() => (props.layout === 'mix' && 'light') || props.navTheme); const runtimeTheme = computed(() => (props.layout === 'mix' && 'light') || props.navTheme);
...@@ -125,6 +125,12 @@ const SiderMenu: FunctionalComponent<SiderMenuProps> = (props: SiderMenuProps) = ...@@ -125,6 +125,12 @@ const SiderMenu: FunctionalComponent<SiderMenuProps> = (props: SiderMenuProps) =
if (hasSide.value && flatMenuData.value.length === 0) { if (hasSide.value && flatMenuData.value.length === 0) {
return null; return null;
} }
watch(
() => context.selectedKeys,
n => {
console.log('watch:context', n);
},
);
const defaultMenuDom = ( const defaultMenuDom = (
<BaseMenu <BaseMenu
prefixCls={getPrefixCls()} prefixCls={getPrefixCls()}
......
import { FunctionalComponent, computed, toRefs, CSSProperties } from 'vue'; import { FunctionalComponent, computed, toRefs, CSSProperties } 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';
import { useProProvider } from './ProProvider'; import { useRouteContext } from './RouteContext';
import { ContentWidth } from './typings'; import type { ContentWidth } from './typings';
const { Content } = Layout; const { Content } = Layout;
...@@ -16,7 +16,7 @@ export interface WrapContentProps { ...@@ -16,7 +16,7 @@ export interface WrapContentProps {
} }
export const WrapContent: FunctionalComponent<WrapContentProps> = (props, { slots, attrs }) => { export const WrapContent: FunctionalComponent<WrapContentProps> = (props, { slots, attrs }) => {
const { getPrefixCls } = toRefs(useProProvider()); const { getPrefixCls } = toRefs(useRouteContext());
const prefixCls = getPrefixCls.value('basicLayout'); const prefixCls = getPrefixCls.value('basicLayout');
const classNames = computed(() => { const classNames = computed(() => {
return { return {
......
...@@ -12,21 +12,14 @@ import { ...@@ -12,21 +12,14 @@ import {
export type ContextType<T> = any; export type ContextType<T> = any;
export type CreateContext<T> = [ export type CreateContext<T> = DefineComponent<{}, () => VNode | VNode[] | undefined, any>;
// UnwrapRef<T> | T,
DefineComponent<{}, () => VNode | VNode[] | undefined, any>,
];
export const createContext = <T>( export const createContext = <T>(
// context: ContextType<T>,
contextInjectKey: InjectionKey<ContextType<T>> = Symbol(), contextInjectKey: InjectionKey<ContextType<T>> = Symbol(),
injectCompName: string = 'Context.Provider',
): CreateContext<T> => { ): CreateContext<T> => {
// const state = reactive<ContextType<T>>({
// ...toRaw(context),
// });
const ContextProvider = defineComponent({ const ContextProvider = defineComponent({
name: 'ContextProvider', name: injectCompName,
props: { props: {
value: { value: {
type: Object as PropType<ContextType<T>>, type: Object as PropType<ContextType<T>>,
...@@ -39,11 +32,11 @@ export const createContext = <T>( ...@@ -39,11 +32,11 @@ export const createContext = <T>(
}, },
}); });
return [ContextProvider]; return ContextProvider;
}; };
export const useContext = <T>( export const useContext = <T>(
contextInjectKey: InjectionKey<ContextType<T>> = Symbol(), contextInjectKey: string | InjectionKey<ContextType<T>> = Symbol(),
defaultValue?: ContextType<T>, defaultValue?: ContextType<T>,
): T => { ): T => {
return inject(contextInjectKey, defaultValue || ({} as T)); return inject(contextInjectKey, defaultValue || ({} as T));
......
...@@ -4,12 +4,12 @@ export { default as FooterToolbar } from './FooterToolbar'; ...@@ -4,12 +4,12 @@ export { default as FooterToolbar } from './FooterToolbar';
export { default as GlobalFooter } from './GlobalFooter'; export { default as GlobalFooter } from './GlobalFooter';
export { default as GridContent } from './GridContent'; export { default as GridContent } from './GridContent';
export { WrapContent } from './WrapContent'; export { WrapContent } from './WrapContent';
export { // export {
default as ProProvider, // default as ProProvider,
defaultProProviderProps, // defaultProProviderProps,
useProProvider, // useProProvider,
ProProviderData, // ProProviderData,
} from './ProProvider'; // } from './ProProvider';
export { PageContainer } from './PageContainer'; export { PageContainer } from './PageContainer';
export { default as SiderMenuWrapper, SiderMenuWrapperProps } from './SiderMenu/index'; export { default as SiderMenuWrapper, SiderMenuWrapperProps } from './SiderMenu/index';
export { export {
......
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