eslint-plugin-react icon indicating copy to clipboard operation
eslint-plugin-react copied to clipboard

'React' is defined but never used no-unused-vars

Open VanessaChu opened this issue 5 years ago • 11 comments

When i run eslint on my code, I get the error: 'React' is defined but never used no-unused-vars when I remove import 'React' from 'react' I get the error 'React' must be in scope when using JSX

I tried enabling the rules below but still receive the error. "react/jsx-uses-react": 1, "react/jsx-uses-vars": 1, "react/react-in-jsx-scope": 1

Can someone help me check if my configurations are correct, if I'm not overriding anything?

{
  "parser": "babel-eslint",
  "extends": [
    "eslint:recommended",
    "airbnb",
    "plugin:flowtype/recommended"
  ],
  "plugins": [
    "babel",
    "react",
    "flowtype"
  ],
  "rules": {
    "react/jsx-uses-react": 1,
    "react/jsx-uses-vars": 1,
    "react/react-in-jsx-scope": 1,
  
    // Indent with 4 spaces
    "indent": [
      "error",
      4
    ],
    // Indent JSX with 4 spaces
    "react/jsx-indent": [
      "error",
      4
    ],
    // Indent props with 4 spaces
    "react/jsx-indent-props": [
      "error",
      4
    ],
    // TODO: Remove all of these exceptions
    // We have code that violates each one of these rules.
    // We should fix the style then remove the rules when we can.
    "consistent-return": "off",
    "flowtype/no-types-missing-file-annotation": "off",
    "import/extensions": "off",
    "import/no-unresolved": "off",
    "import/no-named-as-default": "off",
    "import/no-named-as-default-member": "off",
    "import/prefer-default-export": "off",
    "react/default-props-match-prop-types": "off",
    "react/forbid-prop-types": "off",
    "react/jsx-closing-tag-location": "off",
    "react/jsx-filename-extension": "off",
    "react/no-string-refs": "off",
    "react/no-unused-prop-types": "off",
    "react/no-unused-state": "off",
    "react/prefer-stateless-function": "off",
    "react/prop-types": "off",
    "react/require-default-props": "off",
    "react/sort-comp": "off",
    "max-len": "off",
    "no-case-declarations": "off",
    "no-console": "off",
    "no-mixed-operators": "off",
    "no-nested-ternary": "off",
    "no-shadow": "off",
    "no-use-before-define": "off",
    "no-underscore-dangle": "off",
    "no-unused-expressions": "off",
    "prefer-promise-reject-errors": "off"
  },
  "env": {
    "jest": true
  },
  "globals": {
    "fetch": false,
    "Response": false,
    "React": true
  }
}

I am using these versions in package.json: devDependencies

      "eslint-config-airbnb": "16.1.0",
      "eslint-plugin-babel": "^5.1.0",
      "eslint-plugin-flowtype": "^2.46.1",
      "eslint-plugin-react": "^7.9.1",

dependencies

  "react": "16.0.0",
  "react-native": "0.50.4",

VanessaChu avatar Dec 10 '18 20:12 VanessaChu

I'd include the explicit import, and remove it as a global from your "globals" configuration.

ljharb avatar Dec 10 '18 23:12 ljharb

I have included the explicit import and removing it as global did not change anything

VanessaChu avatar Dec 12 '18 22:12 VanessaChu

Can you share the contents of the file it's erroring on, and the exact error message on the CLI, complete with line number?

ljharb avatar Dec 13 '18 00:12 ljharb

@ljharb I have the same issue.

JSX File:

/** @jsx jsx */     // <- required by @emotion/core
import React from "react";  // error
import { Link } from "gatsby";
import Helmet from "react-helmet";
import { css, jsx } from "@emotion/core";

const Header = () => (
  <div
    css={css`
      background: rebeccapurple;
      margin-bottom: 1.45rem;
    `}>
    <div
      css={css`
        margin: 0 auto;
        max-width: 960px;
        padding: 1.45rem 1.0875rem;
      `}>
      <h1 style={{ margin: 0 }}>
        <Link
          to="/"
          css={css`
            color: white;
            text-decoration: none;
          `}>
          Gatsby
        </Link>
      </h1>
    </div>
  </div>
);

const TemplateWrapper = ({ children }) => (
  <>
    <Helmet
      title="Blog"
      meta={[
        { name: "description", content: "Sample" },
        { name: "keywords", content: "sample, something" }
      ]}
    />
    <Header />
    <div
      css={css`
        margin: 0 auto;
        max-width: 960px;
        padding: 0px 1.0875rem 1.45rem;
        padding-top: 0px;
      `}>
      {children}
    </div>
  </>
);

export default TemplateWrapper;

CLI output:

▶ [blog/blog] (master ⁚ ✘!?) (⬢ v10.16.0) yarn lint      
yarn run v1.17.0
$ eslint ./src --ignore-path .gitignore

/Users/gagan/scratch/blog/blog/src/layouts/index.js
   2:8   error  'React' is defined but never used  no-unused-vars

ESLint config

{
  "root": true,
  "parser": "babel-eslint",
  "parserOptions": {
    "ecmaVersion": 2018,
    "sourceType": "module",
    "ecmaFeatures": {
      "jsx": true,
      "modules": true
    }
  },
  "env": {
    "browser": true,
    "es6": true,
    "node": true,
    "jest": true
  },
  "plugins": ["react", "react-hooks", "jsx-a11y", "import"],
  "extends": [
    "airbnb",
    "eslint:recommended",
    "plugin:prettier/recommended",
    "prettier/react",
    "prettier/standard",
    "plugin:react/recommended",
    "plugin:jsx-a11y/recommended"
  ],
  "settings": {
    "react": {
      "version": "detect"
    }
  },
  "rules": {
//    "no-unused-vars": ["warn"],
    "prettier/prettier": ["error", {"singleQuote": false}],
    "react/jsx-filename-extension": [1, { "extensions": [".js", ".jsx"] }],
    "react/jsx-uses-react": 2,
    "react/jsx-uses-vars": 2,
    "react/react-in-jsx-scope": 2,
    "react-hooks/rules-of-hooks": "error",
    "react-hooks/exhaustive-deps": "warn",
    "react/display-name": 0,
    "react/prop-types": [0, { "ignore": ["children"] }],
    "jsx-a11y/anchor-is-valid": 0
  }
}

IDE: WebStorm Package.json:

"dependencies": {
    "@emotion/core": "^10.0.14",
    "@emotion/styled": "^10.0.14",
    "gatsby": "^2.11.7",
    "gatsby-plugin-emotion": "^4.1.0",
    "gatsby-plugin-react-helmet": "^3.1.0",
    "gatsby-remark-prismjs": "^3.3.0",
    "prismjs": "^1.16.0",
    "react": "^16.8.6",
    "react-dom": "^16.8.6",
    "react-helmet": "^5.2.0"
  },
  "devDependencies": {
    "eslint": "^6.0.1",
    "eslint-config-airbnb": "^17.1.1",
    "eslint-config-prettier": "^6.0.0",
    "eslint-plugin-import": "^2.18.0",
    "eslint-plugin-jsx-a11y": "^6.2.3",
    "eslint-plugin-prettier": "^3.1.0",
    "eslint-plugin-react": "^7.14.2",
    "eslint-plugin-react-hooks": "^1.6.1",
    "husky": "^3.0.0",
    "lint-staged": "^9.0.0",
    "prettier": "^1.18.2",
    "prettier-eslint-cli": "^5.0.0"
  },

totsteps avatar Jul 02 '19 18:07 totsteps

Seems like /** @jsx jsx */ is causing the error. Error no longer appears after removing it.

I think this can be closed unless @VanessaChu haven't resolved the issue.

totsteps avatar Jul 02 '19 19:07 totsteps

indeed; when that comment is present, you don't need the React import and can/should delete it.

ljharb avatar Jul 03 '19 06:07 ljharb

@ljharb @gagan0723 -

indeed; when that comment is present, you don't need the React import and can/should delete it.

I believe that this statement is incorrect, at least when using emotion 10. See https://github.com/yannickcr/eslint-plugin-react/issues/2156#issuecomment-554844831 and https://github.com/emotion-js/emotion/issues/1549

justingrant avatar Nov 18 '19 04:11 justingrant

Any chance there is an update on this?

jamesjenkinsdmno avatar Dec 06 '21 21:12 jamesjenkinsdmno

https://github.com/yannickcr/eslint-plugin-react/issues/2156#issuecomment-680642027

ljharb avatar Dec 06 '21 21:12 ljharb

As of react 17 you dont need to import react at the top of the file, ive just done this and if you are using typescript you just need to add jsx: "react-jsx" into compiler options and disable this rule.

The-Code-Monkey avatar May 04 '22 11:05 The-Code-Monkey

@The-Code-Monkey the proper way to handle this is explained here: https://github.com/jsx-eslint/eslint-plugin-react#configuration

If you are using the new JSX transform from React 17, extend react/jsx-runtime in your eslint config (add "plugin:react/jsx-runtime" to "extends") to disable the relevant rules.

ljharb avatar May 04 '22 18:05 ljharb

Closing per https://github.com/jsx-eslint/eslint-plugin-react/issues/2080#issuecomment-507813363; please file a new issue if anyone's still having trouble.

ljharb avatar Oct 04 '22 21:10 ljharb