Skip to content

Commit 64dc302

Browse files
memoize text comp
1 parent f50ad38 commit 64dc302

File tree

1 file changed

+86
-75
lines changed

1 file changed

+86
-75
lines changed

client/packages/lowcoder/src/comps/comps/textComp.tsx

Lines changed: 86 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ import { PaddingControl } from "../controls/paddingControl";
2121
import React, { useContext, useEffect } from "react";
2222
import { EditorContext } from "comps/editorState";
2323
import { clickEvent, eventHandlerControl } from "../controls/eventHandlerControl";
24+
import { NewChildren } from "../generators/uiCompBuilder";
25+
import { RecordConstructorToComp } from "lowcoder-core";
26+
import { ToViewReturn } from "../generators/multi";
2427

2528
const EventOptions = [clickEvent] as const;
2629

@@ -130,87 +133,95 @@ const VerticalAlignmentOptions = [
130133
{ label: <AlignVerticalCenter />, value: "center" },
131134
{ label: <AlignBottom />, value: "flex-end" },
132135
] as const;
136+
const childrenMap = {
137+
text: stringExposingStateControl(
138+
"text",
139+
trans("textShow.text", { name: "{{currentUser.name}}" })
140+
),
141+
onEvent: eventHandlerControl(EventOptions),
142+
autoHeight: AutoHeightControl,
143+
type: dropdownControl(typeOptions, "markdown"),
144+
horizontalAlignment: alignWithJustifyControl(),
145+
verticalAlignment: dropdownControl(VerticalAlignmentOptions, "center"),
146+
style: styleControl(TextStyle, 'style'),
147+
animationStyle: styleControl(AnimationStyle, 'animationStyle'),
148+
margin: MarginControl,
149+
padding: PaddingControl,
150+
};
133151

134-
let TextTmpComp = (function () {
135-
const childrenMap = {
136-
text: stringExposingStateControl(
137-
"text",
138-
trans("textShow.text", { name: "{{currentUser.name}}" })
139-
),
140-
onEvent: eventHandlerControl(EventOptions),
141-
autoHeight: AutoHeightControl,
142-
type: dropdownControl(typeOptions, "markdown"),
143-
horizontalAlignment: alignWithJustifyControl(),
144-
verticalAlignment: dropdownControl(VerticalAlignmentOptions, "center"),
145-
style: styleControl(TextStyle, 'style'),
146-
animationStyle: styleControl(AnimationStyle, 'animationStyle'),
147-
margin: MarginControl,
148-
padding: PaddingControl,
149-
};
150-
return new UICompBuilder(childrenMap, (props, dispatch) => {
151-
const value = props.text.value;
152-
153-
return (
154-
<TextContainer
155-
$animationStyle={props.animationStyle}
156-
$type={props.type}
157-
$styleConfig={props.style}
158-
style={{
159-
justifyContent: props.horizontalAlignment,
160-
alignItems: props.autoHeight ? "center" : props.verticalAlignment,
161-
textAlign: props.horizontalAlignment,
162-
rotate: props.style.rotation
163-
}}
164-
onClick={() => props.onEvent("click")}
165-
>
166-
{props.type === "markdown" ? <TacoMarkDown>{value}</TacoMarkDown> : value}
167-
</TextContainer>
168-
);
169-
})
170-
.setPropertyViewFn((children) => {
171-
return (
152+
type ChildrenType = NewChildren<RecordConstructorToComp<typeof childrenMap>>;
153+
154+
const TextPropertyView = React.memo((props: {
155+
children: ChildrenType
156+
}) => {
157+
return (
158+
<>
159+
<Section name={sectionNames.basic}>
160+
{props.children.type.propertyView({
161+
label: trans("value"),
162+
tooltip: trans("textShow.valueTooltip"),
163+
radioButton: true,
164+
})}
165+
{props.children.text.propertyView({})}
166+
</Section>
167+
168+
{["logic", "both"].includes(useContext(EditorContext).editorModeStatus) && (
169+
<Section name={sectionNames.interaction}>
170+
{hiddenPropertyView(props.children)}
171+
{props.children.onEvent.getPropertyView()}
172+
</Section>
173+
)}
174+
175+
{["layout", "both"].includes(useContext(EditorContext).editorModeStatus) && (
172176
<>
173-
<Section name={sectionNames.basic}>
174-
{children.type.propertyView({
175-
label: trans("value"),
176-
tooltip: trans("textShow.valueTooltip"),
177+
<Section name={sectionNames.layout}>
178+
{props.children.autoHeight.getPropertyView()}
179+
{!props.children.autoHeight.getView() &&
180+
props.children.verticalAlignment.propertyView({
181+
label: trans("textShow.verticalAlignment"),
182+
radioButton: true,
183+
})}
184+
{props.children.horizontalAlignment.propertyView({
185+
label: trans("textShow.horizontalAlignment"),
177186
radioButton: true,
178187
})}
179-
{children.text.propertyView({})}
180188
</Section>
181-
182-
{["logic", "both"].includes(useContext(EditorContext).editorModeStatus) && (
183-
<Section name={sectionNames.interaction}>
184-
{hiddenPropertyView(children)}
185-
{children.onEvent.getPropertyView()}
186-
</Section>
187-
)}
188-
189-
{["layout", "both"].includes(useContext(EditorContext).editorModeStatus) && (
190-
<>
191-
<Section name={sectionNames.layout}>
192-
{children.autoHeight.getPropertyView()}
193-
{!children.autoHeight.getView() &&
194-
children.verticalAlignment.propertyView({
195-
label: trans("textShow.verticalAlignment"),
196-
radioButton: true,
197-
})}
198-
{children.horizontalAlignment.propertyView({
199-
label: trans("textShow.horizontalAlignment"),
200-
radioButton: true,
201-
})}
202-
</Section>
203-
<Section name={sectionNames.style}>
204-
{children.style.getPropertyView()}
205-
</Section>
206-
<Section name={sectionNames.animationStyle} hasTooltip={true}>
207-
{children.animationStyle.getPropertyView()}
208-
</Section>
209-
</>
210-
)}
189+
<Section name={sectionNames.style}>
190+
{props.children.style.getPropertyView()}
191+
</Section>
192+
<Section name={sectionNames.animationStyle} hasTooltip={true}>
193+
{props.children.animationStyle.getPropertyView()}
194+
</Section>
211195
</>
212-
);
213-
})
196+
)}
197+
</>
198+
);
199+
})
200+
201+
const TextView = React.memo((props: ToViewReturn<ChildrenType>) => {
202+
const value = props.text.value;
203+
204+
return (
205+
<TextContainer
206+
$animationStyle={props.animationStyle}
207+
$type={props.type}
208+
$styleConfig={props.style}
209+
style={{
210+
justifyContent: props.horizontalAlignment,
211+
alignItems: props.autoHeight ? "center" : props.verticalAlignment,
212+
textAlign: props.horizontalAlignment,
213+
rotate: props.style.rotation
214+
}}
215+
onClick={() => props.onEvent("click")}
216+
>
217+
{props.type === "markdown" ? <TacoMarkDown>{value}</TacoMarkDown> : value}
218+
</TextContainer>
219+
);
220+
}, (prev, next) => JSON.stringify(prev) === JSON.stringify(next));
221+
222+
let TextTmpComp = (function () {
223+
return new UICompBuilder(childrenMap, (props) => <TextView {...props} />)
224+
.setPropertyViewFn((children) => <TextPropertyView children={children} />)
214225
.build();
215226
})();
216227

0 commit comments

Comments
 (0)