Last active
June 16, 2023 15:26
-
-
Save sorenlouv/fc897c1629979e669714893df966b1b7 to your computer and use it in GitHub Desktop.
React hook for getting a unique identifier for a component
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import { useRef } from 'react'; | |
let uniqueId = 0; | |
const getUniqueId = () => uniqueId++; | |
export function useComponentId() { | |
const idRef = useRef(getUniqueId()); | |
return idRef.current; | |
} |
In cases where I don't need globally unique IDs, but rather IDs unique per component I'm using this hook:
export function useIdGenerator(): () => number {
const ref = useRef(0);
function getId() {
ref.current += 1;
return ref.current;
}
return getId;
}
On a side note, nanoId
is considerably faster than shortId
or uniqueId
according to their benchmarks.
There is an open issue for this on the react repo.
Here is a more robust implementation that also supports SSR.
Also, for test snapshot support, you'll want a predictable id, maybe using a different prop from the instance.
You shouldn't be using snapshots at all. write proper tests.
For anyone stumbling upon this in 2023 there's React.useId
for this very purpose since React v18.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
It does. You use different ID generation methods. If one of the different methods generate non-unique ID, it will work in one, but fail in the other or lead to different results, depending on how you use the generated ID.
Sorry. I don't get what you are talking about. You've just changed things replying to my initial question. Why is it null instead of undefined? Also you did not answer why the undefined check is not needed. I don't understand the problem.