Skip to content

Commit 0c00fb0

Browse files
committed
perf: optimize reorder performance in BasicPanel
1 parent 9ea60ac commit 0c00fb0

1 file changed

Lines changed: 28 additions & 7 deletions

File tree

src/components/editor/basic/BasicPanel.tsx

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useState } from "react";
1+
import React, { useCallback, useEffect, useRef, useState } from "react";
22
import { PlusCircle, GripVertical, Trash2, Eye, EyeOff } from "lucide-react";
33
import { Reorder, AnimatePresence, motion } from "framer-motion";
44
import { useTranslations } from "@/i18n/compat/client";
@@ -18,6 +18,7 @@ interface CustomFieldProps {
1818
field: CustomFieldType;
1919
onUpdate: (field: CustomFieldType) => void;
2020
onDelete: (id: string) => void;
21+
onReorderEnd: () => void;
2122
}
2223

2324
const itemAnimations = {
@@ -31,6 +32,7 @@ const CustomField: React.FC<CustomFieldProps> = ({
3132
field,
3233
onUpdate,
3334
onDelete,
35+
onReorderEnd,
3436
}) => {
3537
const t = useTranslations("workbench.basicPanel");
3638

@@ -39,6 +41,7 @@ const CustomField: React.FC<CustomFieldProps> = ({
3941
value={field}
4042
id={field.id}
4143
className="group touch-none list-none"
44+
onDragEnd={onReorderEnd}
4245
>
4346
<motion.div
4447
{...itemAnimations}
@@ -169,15 +172,28 @@ const BasicPanel: React.FC = () => {
169172
visible: field.visible ?? true,
170173
}));
171174
});
175+
const basicFieldsRef = useRef(basicFields);
176+
const customFieldsRef = useRef(customFields);
172177
const t = useTranslations("workbench.basicPanel");
173178

179+
useEffect(() => {
180+
basicFieldsRef.current = basicFields;
181+
}, [basicFields]);
182+
183+
useEffect(() => {
184+
customFieldsRef.current = customFields;
185+
}, [customFields]);
186+
174187
const handleBasicReorder = (newOrder: BasicFieldType[]) => {
188+
basicFieldsRef.current = newOrder;
175189
setBasicFields(newOrder);
190+
};
191+
192+
const commitBasicReorder = useCallback(() => {
176193
updateBasicInfo({
177-
...basic,
178-
fieldOrder: newOrder,
194+
fieldOrder: basicFieldsRef.current,
179195
});
180-
};
196+
}, [updateBasicInfo]);
181197

182198
const toggleFieldVisibility = (fieldId: string, isVisible: boolean) => {
183199
const newFields = basicFields.map((field) =>
@@ -245,12 +261,15 @@ const BasicPanel: React.FC = () => {
245261
};
246262

247263
const handleCustomFieldsReorder = (newOrder: CustomFieldType[]) => {
264+
customFieldsRef.current = newOrder;
248265
setCustomFields(newOrder);
266+
};
267+
268+
const commitCustomFieldsReorder = useCallback(() => {
249269
updateBasicInfo({
250-
...basic,
251-
customFields: newOrder,
270+
customFields: customFieldsRef.current,
252271
});
253-
};
272+
}, [updateBasicInfo]);
254273

255274
const renderBasicField = (field: BasicFieldType) => {
256275
const selectedIcon = basic?.icons?.[field.key] || "User";
@@ -262,6 +281,7 @@ const BasicPanel: React.FC = () => {
262281
key={field.id}
263282
className="group touch-none list-none"
264283
dragListener={field.key !== "name" && field.key !== "title"}
284+
onDragEnd={commitBasicReorder}
265285
>
266286
<motion.div
267287
{...itemAnimations}
@@ -428,6 +448,7 @@ const BasicPanel: React.FC = () => {
428448
field={field}
429449
onUpdate={updateCustomField}
430450
onDelete={deleteCustomField}
451+
onReorderEnd={commitCustomFieldsReorder}
431452
/>
432453
))}
433454
</Reorder.Group>

0 commit comments

Comments
 (0)