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 _ from 'lodash';
import React, { FC, useEffect, useMemo, useRef, useState } from 'react';
import React, { FC, useCallback, useEffect, useMemo, useRef, useState } from 'react';
import {
Location,
NavigateFunction,
@ -62,11 +62,13 @@ const RouterBasenameContext = React.createContext<string>('');
RouterBasenameContext.displayName = 'RouterBasenameContext';
const IsSubPageClosedByPageMenuContext = React.createContext<{
isSubPageClosedByPageMenu: boolean;
isSubPageClosedByPageMenu: () => boolean;
setFieldSchema: React.Dispatch<React.SetStateAction<Schema>>;
reset: () => void;
}>({
isSubPageClosedByPageMenu: false,
setFieldSchema: () => {},
isSubPageClosedByPageMenu: () => false,
setFieldSchema: () => { },
reset: () => { },
});
IsSubPageClosedByPageMenuContext.displayName = 'IsSubPageClosedByPageMenuContext';
@ -75,7 +77,7 @@ export const IsSubPageClosedByPageMenuProvider: FC = ({ children }) => {
const prevParamsRef = useRef<any>({});
const [fieldSchema, setFieldSchema] = useState<Schema>(null);
const isSubPageClosedByPageMenu = useMemo(() => {
const isSubPageClosedByPageMenu = useCallback(() => {
const result =
_.isEmpty(params['*']) &&
fieldSchema?.['x-component-props']?.openMode === 'page' &&
@ -86,7 +88,11 @@ export const IsSubPageClosedByPageMenuProvider: FC = ({ children }) => {
return result;
}, [fieldSchema, params]);
const value = useMemo(() => ({ isSubPageClosedByPageMenu, setFieldSchema }), [isSubPageClosedByPageMenu]);
const reset = useCallback(() => {
prevParamsRef.current = {};
}, []);
const value = useMemo(() => ({ isSubPageClosedByPageMenu, setFieldSchema, reset }), [isSubPageClosedByPageMenu, reset]);
return (
<IsSubPageClosedByPageMenuContext.Provider value={value}>{children}</IsSubPageClosedByPageMenuContext.Provider>
@ -242,13 +248,13 @@ export const useRouterBasename = () => {
* @returns
*/
export const useIsSubPageClosedByPageMenu = (fieldSchema: Schema) => {
const { isSubPageClosedByPageMenu, setFieldSchema } = React.useContext(IsSubPageClosedByPageMenuContext);
const { isSubPageClosedByPageMenu, setFieldSchema, reset } = React.useContext(IsSubPageClosedByPageMenuContext);
useEffect(() => {
setFieldSchema(fieldSchema);
}, [fieldSchema, setFieldSchema]);
return isSubPageClosedByPageMenu;
return { isSubPageClosedByPageMenu, reset };
};
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 { setSubmitted: setParentSubmitted } = { ...props, ...props.value };
const service = useBlockServiceInActionButton();
const isSubPageClosedByPageMenu = useIsSubPageClosedByPageMenu(useFieldSchema());
const { isSubPageClosedByPageMenu, reset } = useIsSubPageClosedByPageMenu(useFieldSchema());
useEffect(() => {
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
service.loading = true;
await service.refreshAsync();
@ -41,7 +43,7 @@ export const ActionContextProvider: React.FC<ActionContextProps & { value?: Acti
};
run();
}, [visible, service?.refresh, setParentSubmitted, isSubPageClosedByPageMenu]);
}, [visible, service, setParentSubmitted, isSubPageClosedByPageMenu, submitted, reset]);
const value = useMemo(() => ({ ...props, ...props?.value, submitted, setSubmitted }), [props, submitted]);