diff --git a/frontend/src/components/button.tsx b/frontend/src/components/button.tsx index ecdf8a1..a817536 100644 --- a/frontend/src/components/button.tsx +++ b/frontend/src/components/button.tsx @@ -1,5 +1,5 @@ -import React, { MouseEventHandler } from 'react'; -import { OverlayTrigger, Badge, Button, Tooltip } from 'react-bootstrap'; +import React, { MouseEventHandler, useEffect, useRef, useState } from 'react'; +import { OverlayTrigger, Badge, Button, Tooltip, ToggleButton } from 'react-bootstrap'; interface ButtonComponentProps { name: string; @@ -11,34 +11,43 @@ interface ButtonComponentProps { mapping?: [string, string]; // Enforce a tuple of two strings } -const ButtonComponentRef = React.forwardRef( - (props, ref) => { - const { name, fullname, value, readOnly, docString, onToggle, mapping } = props; +export const ButtonComponent = React.memo((props: ButtonComponentProps) => { + const renderCount = useRef(0); - const buttonName = mapping ? (value ? mapping[0] : mapping[1]) : name; + const [checked, setChecked] = useState(false); - const tooltip = {docString}; + useEffect(() => { + renderCount.current++; + }); + const { name, fullname, value, readOnly, docString, onToggle, mapping } = props; - return ( -
- + const buttonName = mapping ? (value ? mapping[0] : mapping[1]) : name; - {docString && ( - - - ? - - - )} -
- ); - } -); + const tooltip = {docString}; -export const ButtonComponent = React.memo(ButtonComponentRef); + return ( +
+

Render count: {renderCount.current}

+ setChecked(e.currentTarget.checked)}> +

{buttonName}

+
+ + {docString && ( + + + ? + + + )} +
+ ); +}); diff --git a/frontend/src/components/component.tsx b/frontend/src/components/component.tsx index e6214f1..3067db0 100644 --- a/frontend/src/components/component.tsx +++ b/frontend/src/components/component.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useEffect, useRef } from 'react'; interface ComponentProps { name: string; @@ -18,48 +18,60 @@ export const ComponentLabel = ({ return ; }; -export const Component = ({ - name, - value, - readOnly, - type, - docString -}: ComponentProps) => { - switch (type) { - case 'int': - case 'float': - return ( - - ); - case 'str': - return ( - - ); - case 'bool': - return ( - - ); - case 'method': - return

Method: {name}

; - default: - return

Unsupported type: {type}

; +export const Component = React.memo( + ({ name, value, readOnly, type, docString }: ComponentProps) => { + const renderCount = useRef(0); + + useEffect(() => { + renderCount.current++; + }); + switch (type) { + case 'int': + case 'float': + return ( + <> +

Render count: {renderCount.current}

+ + + ); + case 'str': + return ( + <> +

Render count: {renderCount.current}

+ + + ); + case 'bool': + return ( + + ); + case 'method': + return ( + <> +

Render count: {renderCount.current}

+

Method: {name}

+ + ); + default: + return

Unsupported type: {type}

; + } } -}; +);