Skip to content

Instantly share code, notes, and snippets.

@IrvingArmenta
Created October 2, 2022 02:50
Show Gist options
  • Select an option

  • Save IrvingArmenta/a6d7fc76ed538697ad18b7f074accdde to your computer and use it in GitHub Desktop.

Select an option

Save IrvingArmenta/a6d7fc76ed538697ad18b7f074accdde to your computer and use it in GitHub Desktop.
Example of a forward ref generic component in React 18
import React, { ForwardedRef, forwardRef, MouseEvent } from 'react';
type ClickableListProps<T> = {
items: T[];
onSelect: (
item: T,
event: MouseEvent<HTMLButtonElement, globalThis.MouseEvent>,
) => void;
};
function ClickableListInner<T>(
props: ClickableListProps<T>,
ref: ForwardedRef<HTMLUListElement>,
) {
return (
<ul ref={ref}>
{props.items.map((item, i) => (
<li key={i}>
<>
<button onClick={(e) => props.onSelect(item, e)}>Select</button>
{item}
</>
</li>
))}
</ul>
);
}
const ClickableList = forwardRef(ClickableListInner) as <T>(
props: ClickableListProps<T> & { ref?: ForwardedRef<HTMLUListElement> },
) => ReturnType<typeof ClickableListInner>;
export default ClickableList;
@Shentoza
Copy link

Shentoza commented Aug 13, 2024

I think they just showed another approach for the ClickableListInner.
The forwardRef is exactly the same as the first snippet

@CharlieBreval12
Copy link

Thanks a lot for this

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment