fix: block refresh issue (#6233)

This commit is contained in:
Zeke Zhang 2025-02-17 16:45:19 +08:00 committed by GitHub
parent 250efcd6ed
commit 05e107f4fa
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 19 additions and 11 deletions

View File

@ -9,7 +9,7 @@
import { Schema } from '@formily/json-schema'; import { Schema } from '@formily/json-schema';
import _ from 'lodash'; import _ from 'lodash';
import React, { FC, useEffect, useMemo, useRef, useState } from 'react'; import React, { FC, useCallback, useEffect, useMemo, useRef, useState } from 'react';
import { import {
Location, Location,
NavigateFunction, NavigateFunction,
@ -62,11 +62,13 @@ const RouterBasenameContext = React.createContext<string>('');
RouterBasenameContext.displayName = 'RouterBasenameContext'; RouterBasenameContext.displayName = 'RouterBasenameContext';
const IsSubPageClosedByPageMenuContext = React.createContext<{ const IsSubPageClosedByPageMenuContext = React.createContext<{
isSubPageClosedByPageMenu: boolean; isSubPageClosedByPageMenu: () => boolean;
setFieldSchema: React.Dispatch<React.SetStateAction<Schema>>; setFieldSchema: React.Dispatch<React.SetStateAction<Schema>>;
reset: () => void;
}>({ }>({
isSubPageClosedByPageMenu: false, isSubPageClosedByPageMenu: () => false,
setFieldSchema: () => {}, setFieldSchema: () => { },
reset: () => { },
}); });
IsSubPageClosedByPageMenuContext.displayName = 'IsSubPageClosedByPageMenuContext'; IsSubPageClosedByPageMenuContext.displayName = 'IsSubPageClosedByPageMenuContext';
@ -75,7 +77,7 @@ export const IsSubPageClosedByPageMenuProvider: FC = ({ children }) => {
const prevParamsRef = useRef<any>({}); const prevParamsRef = useRef<any>({});
const [fieldSchema, setFieldSchema] = useState<Schema>(null); const [fieldSchema, setFieldSchema] = useState<Schema>(null);
const isSubPageClosedByPageMenu = useMemo(() => { const isSubPageClosedByPageMenu = useCallback(() => {
const result = const result =
_.isEmpty(params['*']) && _.isEmpty(params['*']) &&
fieldSchema?.['x-component-props']?.openMode === 'page' && fieldSchema?.['x-component-props']?.openMode === 'page' &&
@ -86,7 +88,11 @@ export const IsSubPageClosedByPageMenuProvider: FC = ({ children }) => {
return result; return result;
}, [fieldSchema, params]); }, [fieldSchema, params]);
const value = useMemo(() => ({ isSubPageClosedByPageMenu, setFieldSchema }), [isSubPageClosedByPageMenu]); const reset = useCallback(() => {
prevParamsRef.current = {};
}, []);
const value = useMemo(() => ({ isSubPageClosedByPageMenu, setFieldSchema, reset }), [isSubPageClosedByPageMenu, reset]);
return ( return (
<IsSubPageClosedByPageMenuContext.Provider value={value}>{children}</IsSubPageClosedByPageMenuContext.Provider> <IsSubPageClosedByPageMenuContext.Provider value={value}>{children}</IsSubPageClosedByPageMenuContext.Provider>
@ -242,13 +248,13 @@ export const useRouterBasename = () => {
* @returns * @returns
*/ */
export const useIsSubPageClosedByPageMenu = (fieldSchema: Schema) => { export const useIsSubPageClosedByPageMenu = (fieldSchema: Schema) => {
const { isSubPageClosedByPageMenu, setFieldSchema } = React.useContext(IsSubPageClosedByPageMenuContext); const { isSubPageClosedByPageMenu, setFieldSchema, reset } = React.useContext(IsSubPageClosedByPageMenuContext);
useEffect(() => { useEffect(() => {
setFieldSchema(fieldSchema); setFieldSchema(fieldSchema);
}, [fieldSchema, setFieldSchema]); }, [fieldSchema, setFieldSchema]);
return isSubPageClosedByPageMenu; return { isSubPageClosedByPageMenu, reset };
}; };
export const CustomRouterContextProvider: FC = ({ children }) => { export const CustomRouterContextProvider: FC = ({ children }) => {

View File

@ -25,11 +25,13 @@ export const ActionContextProvider: React.FC<ActionContextProps & { value?: Acti
const { visible } = { ...props, ...props.value }; const { visible } = { ...props, ...props.value };
const { setSubmitted: setParentSubmitted } = { ...props, ...props.value }; const { setSubmitted: setParentSubmitted } = { ...props, ...props.value };
const service = useBlockServiceInActionButton(); const service = useBlockServiceInActionButton();
const isSubPageClosedByPageMenu = useIsSubPageClosedByPageMenu(useFieldSchema()); const { isSubPageClosedByPageMenu, reset } = useIsSubPageClosedByPageMenu(useFieldSchema());
useEffect(() => { useEffect(() => {
const run = async () => { const run = async () => {
if (visible === false && service && !service.loading && (submitted || isSubPageClosedByPageMenu)) { if (visible === false && service && !service.loading && (submitted || isSubPageClosedByPageMenu())) {
reset();
// Prevent multiple requests from being triggered // Prevent multiple requests from being triggered
service.loading = true; service.loading = true;
await service.refreshAsync(); await service.refreshAsync();
@ -41,7 +43,7 @@ export const ActionContextProvider: React.FC<ActionContextProps & { value?: Acti
}; };
run(); run();
}, [visible, service?.refresh, setParentSubmitted, isSubPageClosedByPageMenu]); }, [visible, service, setParentSubmitted, isSubPageClosedByPageMenu, submitted, reset]);
const value = useMemo(() => ({ ...props, ...props?.value, submitted, setSubmitted }), [props, submitted]); const value = useMemo(() => ({ ...props, ...props?.value, submitted, setSubmitted }), [props, submitted]);