An ESLint plugin to help prevent mistakes when using React's useRef
hook.
Install ESLint and this plugin:
npm install --save-dev eslint eslint-plugin-react-ref
Import pluginReactRef
and add pluginReactRef.configs.recommended
to the extends
array of your configuration file:
import { defineConfig } from "eslint/config";
import pluginReactRef from "eslint-plugin-react-ref";
export default defineConfig([
{
extends: [pluginReactRef.configs.recommended],
},
]);
Or, import pluginReactRef
and add "react-ref": pluginReactRef
to the plugins
object of your configuration file, then configure the rule:
import { defineConfig } from "eslint/config";
import pluginReactRef from "eslint-plugin-react-ref";
export default defineConfig([
{
plugins: {
"react-ref": pluginReactRef,
},
rules: {
"react-ref/ref-usage": "warn",
},
},
]);
Add plugin:react-ref/recommended-legacy
to the extends
array of your .eslintrc
configuration file:
{
"extends": ["plugin:react-ref/recommended-legacy"]
}
Or, add react-ref
to the plugins
array of your .eslintrc
configuration file, then configure the rule:
{
"plugins": ["react-ref"],
"rules": {
"react-ref/ref-usage": "warn"
}
}
This rule helps enforce proper usage of React's useRef
hook by checking two common mistake patterns:
Warns when a ref is being accessed directly, instead of with its current
property.
❌ Incorrect usage
const ref = useRef(false);
useEffect(() => {
// `.current` is missing, the test is always truthy,
// TypeScript doesn't detect anything wrong
if (ref) {
// do something
} else {
// do something else
}
// ...
✅ Correct usage
const ref = useRef(false);
useEffect(() => {
if (ref.current) {
// do something
} else {
// do something else
}
// ...
Note: in this particular case, the ESLint plugin
typescript-eslint
and its ruleno-unnecessary-condition
(part of thestrict
config) would also detect the incorrect usage, asref
is always truthy.
Warns when a ref's value is being accessed during render.
function Component() {
const ref = useRef(null);
// Accessing `ref.current` during render
return <div>{ref.current}</div>;
}
Note that this rule is not yet capable of catching all the possible ways of accessing a ref's value during render. (You could create a function returning a ref's value, and call this function during render; but this is still a React No No!)
Read more about useRef
and its common pitfalls at react.dev/reference/react/useRef.