/** @jsxImportSource react */
import React from "react";
// Function component
export function ReactFunctionComponent(props: { title: string; children?: React.ReactNode }) {
return (
{props.title}
{props.children}
);
}
// Function component with hooks
export function ReactCounterComponent(props: { initialCount?: number }) {
const [count, setCount] = React.useState(props.initialCount ?? 0);
return (
{count}
);
}
// Class component
export class ReactClassComponent extends React.Component<
{ label: string; children?: React.ReactNode },
{ active: boolean }
> {
constructor(props: { label: string; children?: React.ReactNode }) {
super(props);
this.state = { active: false };
}
render() {
return (
{this.props.children}
);
}
}
// Pure component
export class ReactPureComponent extends React.PureComponent<{ value: string }> {
render() {
return {this.props.value};
}
}
// Function component with useRef and useEffect
export function ReactRefEffectComponent(props: { onMount?: (element: HTMLDivElement | null) => void }) {
const divRef = React.useRef(null);
const mountedRef = React.useRef(false);
React.useEffect(() => {
mountedRef.current = true;
props.onMount?.(divRef.current);
return () => {
mountedRef.current = false;
};
}, []);
return (
Component with ref and effect
);
}
// Function component with useEffect that updates state
export function ReactEffectStateComponent(props: { value: string }) {
const [processed, setProcessed] = React.useState("");
const renderCountRef = React.useRef(0);
React.useEffect(() => {
setProcessed(`Processed: ${props.value}`);
}, [props.value]);
renderCountRef.current += 1;
return (
{processed}
{renderCountRef.current}
);
}
// Component for testing prop translation
export function ReactPropsComponent(props: {
text: string;
count: number;
enabled: boolean;
tags?: string[];
onClick?: () => void;
}) {
return (
{props.text}
{props.count}
{props.enabled ? "yes" : "no"}
{props.tags && {props.tags.join(", ")}}
{props.onClick && }
);
}