diff --git a/packages/core/client/src/schema-component/antd/association-field/components/CreateRecordAction.tsx b/packages/core/client/src/schema-component/antd/association-field/components/CreateRecordAction.tsx index e6323c28cce..6a8f294323b 100644 --- a/packages/core/client/src/schema-component/antd/association-field/components/CreateRecordAction.tsx +++ b/packages/core/client/src/schema-component/antd/association-field/components/CreateRecordAction.tsx @@ -7,15 +7,15 @@ * For more information, please refer to: https://www.nocobase.com/agreement. */ -import { observer, useField, useFieldSchema } from '@formily/react'; -import React, { useState } from 'react'; +import { observer, Schema, useField, useFieldSchema } from '@formily/react'; +import React, { useMemo, useState } from 'react'; import { CollectionProvider_deprecated, useCollectionManager_deprecated } from '../../../../collection-manager'; import { NocoBaseRecursionField } from '../../../../formily/NocoBaseRecursionField'; import { CreateAction } from '../../../../schema-initializer/components'; import { ActionContextProvider, useActionContext } from '../../action'; +import { TabsContextProvider } from '../../tabs/context'; import { useAssociationFieldContext, useInsertSchema } from '../hooks'; import schema from '../schema'; -import { TabsContextProvider } from '../../tabs/context'; export const CreateRecordAction = observer( (props) => { @@ -31,12 +31,27 @@ export const CreateRecordAction = observer( const [currentDataSource, setCurrentDataSource] = useState(targetCollection?.dataSource); const [formValueChanged, setFormValueChanged] = useState(false); + const addNewerSchema = useMemo(() => { + return fieldSchema.reduceProperties((buf, s) => { + if (s['x-component'] === 'AssociationField.AddNewer') { + Object.keys(s.parent.properties).forEach((key) => { + if (key !== s.name) { + s.parent.removeProperty(key); + } + }); + return s.parent; + } + return buf; + }) as Schema; + }, [fieldSchema]); + const addbuttonClick = (collectionData) => { insertAddNewer(schema.AddNewer); setVisibleAddNewer(true); setCurrentCollection(collectionData.name); setCurrentDataSource(collectionData.dataSource); }; + return ( addbuttonClick(arg)} /> @@ -51,14 +66,7 @@ export const CreateRecordAction = observer( > - { - return s['x-component'] === 'AssociationField.AddNewer'; - }} - /> + diff --git a/packages/plugins/@nocobase/plugin-mobile/src/client/adaptor-of-desktop/ActionDrawer.tsx b/packages/plugins/@nocobase/plugin-mobile/src/client/adaptor-of-desktop/ActionDrawer.tsx index 2f7458ddae1..aa449d6cf1d 100644 --- a/packages/plugins/@nocobase/plugin-mobile/src/client/adaptor-of-desktop/ActionDrawer.tsx +++ b/packages/plugins/@nocobase/plugin-mobile/src/client/adaptor-of-desktop/ActionDrawer.tsx @@ -7,7 +7,7 @@ * For more information, please refer to: https://www.nocobase.com/agreement. */ -import { ISchema, observer, useField, useFieldSchema } from '@formily/react'; +import { ISchema, observer, Schema, useField, useFieldSchema } from '@formily/react'; import { Action, FlagProvider, @@ -111,6 +111,12 @@ export const ActionDrawerUsedInMobile: any = observer((props: { footerNodeName?: const { visible, setVisible } = useActionContext(); const { visiblePopup } = usePopupContainer(visible); + // 克隆的目的是为了把底部按钮的 schema 去掉,避免重复渲染。 + // 不使用 filterProperties 的原因是防止 Iphone 中出现卡死的问题,具体原因未知。 + const clonedFieldSchema = useMemo(() => { + return new Schema(fieldSchema.toJSON()); + }, []); // 不需要依赖 fieldSchema,不然会导致在弹窗中添加区块时不刷新 UI + // this schema need to add padding in the content area of the popup const isSpecialSchema = isChangePasswordSchema(fieldSchema) || isEditProfileSchema(fieldSchema); @@ -118,19 +124,15 @@ export const ActionDrawerUsedInMobile: any = observer((props: { footerNodeName?: const specialStyle = isSpecialSchema ? { backgroundColor: 'white' } : {}; - const footerSchema = fieldSchema.reduceProperties((buf, s) => { - if (s['x-component'] === footerNodeName) { - return s; - } - return buf; - }); - - const filterProperties = useCallback( - (s) => { - return s['x-component'] !== footerNodeName; - }, - [footerNodeName], - ); + const footerSchema = useMemo(() => { + return clonedFieldSchema.reduceProperties((buf, s) => { + if (s['x-component'] === footerNodeName) { + s.parent.removeProperty(s.name); // 移除掉底部按钮区域的 schema + return s; + } + return buf; + }) as Schema; + }, [clonedFieldSchema, footerNodeName]); const title = field.title || ''; @@ -140,27 +142,15 @@ export const ActionDrawerUsedInMobile: any = observer((props: { footerNodeName?: const popupContent = isSpecialSchema ? (
- +
) : ( - + ); const footerContent = footerSchema ? (
- { - return s['x-component'] === footerNodeName; - }} - /> +
) : null; diff --git a/packages/plugins/@nocobase/plugin-mobile/src/client/pages/dynamic-page/components/MobileDatePicker.tsx b/packages/plugins/@nocobase/plugin-mobile/src/client/pages/dynamic-page/components/MobileDatePicker.tsx index bcc1467ab30..b9537c2d346 100644 --- a/packages/plugins/@nocobase/plugin-mobile/src/client/pages/dynamic-page/components/MobileDatePicker.tsx +++ b/packages/plugins/@nocobase/plugin-mobile/src/client/pages/dynamic-page/components/MobileDatePicker.tsx @@ -7,25 +7,25 @@ * For more information, please refer to: https://www.nocobase.com/agreement. */ -import React, { useState, useCallback, useEffect, useRef } from 'react'; -import { DatePicker, Picker } from 'antd-mobile'; -import { Space, Select } from 'antd'; -import { - mapDatePicker, - DatePicker as NBDatePicker, - useDatePickerContext, - useCompile, - inferPickerType, - TimePicker as NBTimePicker, - mapTimeFormat, - useVariables, - isVariable, - useLocalVariables, -} from '@nocobase/client'; -import { autorun } from '@formily/reactive'; -import dayjs from 'dayjs'; import { connect, mapProps, mapReadPretty, useField, useFieldSchema } from '@formily/react'; +import { autorun } from '@formily/reactive'; +import { + inferPickerType, + isVariable, + mapDatePicker, + mapTimeFormat, + DatePicker as NBDatePicker, + TimePicker as NBTimePicker, + useCompile, + useDatePickerContext, + useLocalVariables, + useVariables, +} from '@nocobase/client'; import { getPickerFormat } from '@nocobase/utils/client'; +import { Select, Space } from 'antd'; +import { DatePicker, Picker } from 'antd-mobile'; +import dayjs from 'dayjs'; +import React, { useCallback, useEffect, useRef, useState } from 'react'; import { useTranslation } from 'react-i18next'; function getPrecision(timeFormat: string): 'hour' | 'minute' | 'second' { @@ -133,7 +133,7 @@ const MobileDateTimePicker = connect( }, []); return ( <> -
!disabled && setVisible(true)}> +
!disabled && setVisible(true)}> setVisible(true)} value={value} @@ -326,7 +326,7 @@ const MobileTimePicker: ComposedMobileTimePicker = connect( }; return ( -
setVisible(true)}> +
setVisible(true)}>
@@ -342,4 +342,4 @@ MobileDateFilterWithPicker.displayName = 'MobileDateFilterWithPicker'; MobileTimePicker.displayName = 'MobileTimePicker'; MobileTimePicker.RangePicker = NBTimePicker.RangePicker; -export { MobileDateTimePicker, MobileRangePicker, MobileDateFilterWithPicker, MobileTimePicker }; +export { MobileDateFilterWithPicker, MobileDateTimePicker, MobileRangePicker, MobileTimePicker }; diff --git a/packages/plugins/@nocobase/plugin-mobile/src/client/pages/dynamic-page/components/MobilePicker.tsx b/packages/plugins/@nocobase/plugin-mobile/src/client/pages/dynamic-page/components/MobilePicker.tsx index 5dbbe58d7f3..4bb68a33041 100644 --- a/packages/plugins/@nocobase/plugin-mobile/src/client/pages/dynamic-page/components/MobilePicker.tsx +++ b/packages/plugins/@nocobase/plugin-mobile/src/client/pages/dynamic-page/components/MobilePicker.tsx @@ -37,7 +37,7 @@ const MobilePicker = connect( return ( <> -
!disabled && setVisible(true)}> +
!disabled && setVisible(true)}>