React: рдЕрдорд╛рдиреНрдп рд╣реБрдХ рдХреЙрд▓ред рд╣реБрдХ рдХреЛ рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рдШрдЯрдХ рдХреЗ рд╢рд░реАрд░ рдХреЗ рдЕрдВрджрд░ рд╣реА рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдирд┐рдореНрди рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХрд╛рд░рдг рд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

рдХреЛ рдирд┐рд░реНрдорд┐рдд 4 рдЕрдкреНрд░реИрд▓ 2019  ┬╖  61рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: facebook/react

рд╣рд╛рдп рд╕рдм, рдореИрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рд╣реВрдВ рдФрд░ рдореИрдВ рдШрдЯрдХреЛрдВ рдХреА рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдореБрдЭреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЬреЛ рдШрдЯрдХ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдЕрд╕реНрд╡реАрдХрд░рдг: рдпрд╣ рдореЗрд░рд╛ рдкрд╣рд▓реА рдмрд╛рд░ рдХреЛрдИ рдореБрджреНрджрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреГрдкрдпрд╛ рдореЗрд░реЗ рд╕рд╛рде рд░рд╣реЗрдВред

рдЗрд╕рд▓рд┐рдП рдореИрдВ рдПрдХ рдЕрдХреЙрд░реНрдбрд┐рдпрди рдШрдЯрдХ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдЗрди рд╡рд░реНрдЧреЛрдВ рдХреЗ рдмреАрдЪ accordion__item--open рдФрд░ accordion__item рдХреЛ рдЦреЛрд▓рдиреЗ рдФрд░ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреЙрдЧрд▓ рдХрд░рддрд╛ рд╣реИред

рдкреИрдХреЗрдЬ.рдЬреЗрд╕рди

{
  "name": "react-lib",
  "version": "0.3.0",
  "description": "A simple UI library of react components",
  "main": "dist/index.js",
  "publishConfig": {
    "registry": ""
  },
  "scripts": {
    "login": "",
    "build": "webpack --mode=production",
    "develop": "webpack --mode=development --watch"
  },
  "repository": {
    "type": "git",
    "url": ""
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "homepage": "",
  "dependencies": {
    "@babel/core": "^7.3.4",
    "@babel/preset-env": "^7.3.4",
    "@babel/preset-react": "^7.0.0",
    "babel-loader": "^8.0.5",
    "eslint": "^5.15.1",
    "eslint-loader": "^2.1.2",
    "webpack": "^4.29.6",
    "webpack-cli": "^3.2.3",
    "webpack-node-externals": "^1.7.2"
  },
  "devDependencies": {
    "eslint-config-airbnb": "^17.1.0",
    "eslint-plugin-import": "^2.16.0",
    "eslint-plugin-jsx-a11y": "^6.2.1",
    "eslint-plugin-react": "^7.12.4",
    "eslint-plugin-react-hooks": "^1.6.0"
  }
}

webpack.config.js

const path = require('path');
const webpack = require('webpack');

module.exports =  {

  mode: 'development',
  optimization: {
    minimize: true,
  },
  entry: './index.js',
  output: {
    path: path.resolve(__dirname, './dist'),
    filename: 'index.js',
    library: '',
    libraryTarget: 'commonjs'
  },
  target: 'node',
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /(node_modules)/,
        loader: 'babel-loader',
        options: {
          presets: ['@babel/preset-env', '@babel/react']
        }
      }
    ]
  } 
};

рдпрд╣ рдЕрдХреЙрд░реНрдбрд┐рдпрди рдХрдВрдЯреЗрдирд░ рд╣реИ:

```
'рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛' рд╕реЗ рдЖрдпрд╛рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛;

рдлрдВрдХреНрд╢рди рдЕрдХреЙрд░реНрдбрд┐рдпрди ({рдмрдЪреНрдЪреЛрдВ}) {

рд╡рд╛рдкрд╕реА (


{ рдмрдЪреНрдЪреЗ }

);

}

рдирд┐рд░реНрдпрд╛рдд рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЕрдХреЙрд░реНрдбрд┐рдпрди;

**This is the accordion item that will live inside the container:** 

'рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛' рд╕реЗ рдЖрдпрд╛рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛, {useState};

рдлрд╝рдВрдХреНрд╢рди AccordionItem ({рд╣реЗрдбрд░, рд╕рд╛рдордЧреНрд░реА}) {

const [ isActive , рдЯреЙрдЧрд▓рдПрдХреНрдЯрд┐рд╡ ] = useState(false);

рд╡рд╛рдкрд╕реА (

рдЕрдХреЙрд░реНрдбрд┐рдпрди__рдЖрдЗрдЯрдо ${ isActive ? 'accordion__item--open' : '' } }>
  <button
    className="accordion__item-header"
    onClick={ () => isActive ? toggleActive(false) : toggleActive(true) }
  >
   { header }
   <svg className="icon icon--debit" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50">
     <path className="icon__path" d="M22.37,22.33V2.67a2.63,2.63,0,0,1,5.26,0V47.24a2.63,2.63,0,0,1-5.26.09V27.58H2.71a2.63,2.63,0,0,1,0-5.25Zm11.92,5.25a2.63,2.63,0,0,1,0-5.25h13a2.63,2.63,0,0,1,0,5.25Z">
     </path>
   </svg>
 </button>

 <div className="accordion__item-content">
   { children }
 </div>


)

};

рдирд┐рд░реНрдпрд╛рдд рдбрд┐рдлрд╝реЙрд▓реНрдЯ AccordionItem;

Now inside of a [create-react-app](https://github.com/sethandleah/myapp) I import these components

My [library](https://github.com/sethandleah/react-lib) and the [create-react-app](https://github.com/sethandleah/myapp) are relative to each other and I am using ```npm link```

'рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛' рд╕реЗ рдЖрдпрд╛рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛;

'рд░рд┐рдПрдХреНрд╢рди-рд▓рд┐рдм' рд╕реЗ {AccordionItem} рдЖрдпрд╛рдд рдХрд░реЗрдВ
'react-lib' рд╕реЗ {Accordion} рдЖрдпрд╛рдд рдХрд░реЗрдВ;

рдлрдВрдХреНрд╢рди рдРрдк ({рдкреНрд░реЛрдкреНрд╕}) {

рд╡рд╛рдкрд╕реА (

  <Accordion>
    <AccordionItem header={"Hello"} content={"World"}/>
  </Accordion>

)

}

рдирд┐рд░реНрдпрд╛рдд рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдРрдк;

I have followed all of these [instructions](https://reactjs.org/warnings/invalid-hook-call-warning.html) and I still get the same error.


**Current behavior?**

рдЕрдорд╛рдиреНрдп рд╣реБрдХ рдХреЙрд▓ред рд╣реБрдХ рдХреЛ рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рдШрдЯрдХ рдХреЗ рд╢рд░реАрд░ рдХреЗ рдЕрдВрджрд░ рд╣реА рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдирд┐рдореНрди рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХрд╛рд░рдг рд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

  1. рдЖрдкрдХреЗ рдкрд╛рд╕ рд░рд┐рдПрдХреНрдЯ рдФрд░ рд░реЗрдВрдбрд░рд░ рдХреЗ рдмреЗрдореЗрд▓ рд╕рдВрд╕реНрдХрд░рдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ рд░рд┐рдПрдХреНрдЯ рдбреЛрдо)
  2. рдЖрдк рдХрд╛рдВрдЯреЛрдВ рдХреЗ рдирд┐рдпрдо рддреЛрдбрд╝ рд░рд╣реЗ рд╣реЛрдВрдЧреЗ
  3. рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдРрдк рдореЗрдВ рд░рд┐рдПрдХреНрдЯ рдХреА рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдХреЙрдкреА рд╣реЛ рд╕рдХрддреА рд╣реИрдВ
    рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдФрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП https://fb.me/react-invalid-hook-call рджреЗрдЦреЗрдВред
**Steps to reproduce**

- clone [https://github.com/sethandleah/react-lib](https://github.com/sethandleah/react-lib)
- clone [https://github.com/sethandleah/myapp](https://github.com/sethandleah/myapp)
- ```cd react-lib```
- ```npm install```
- ```npm link```
- ```cd ../myapp```
- ```npm i```
- ```npm link react-lib```
- ```npm start```

**Expected behavior**

- It should show a button with a "plus" svg sign and the words "Hello" and "World" respectively
- Open devtools and go to elements
- When clicking on the button the class ```accordion_item--open``` should toggle

**To see the above, do the following:**

- Uncomment these lines at ```myapp/src/App.js```

'./accordion' рд╕реЗ рдЕрдХреЙрд░реНрдбрд┐рдпрди рдЖрдпрд╛рдд рдХрд░реЗрдВ;
'./AccordionItem' рд╕реЗ AccordionItem рдЖрдпрд╛рдд рдХрд░реЗрдВ;

- The comment out these line, alse at ```myapp/src/App.js```:

'рд░рд┐рдПрдХреНрд╢рди-рд▓рд┐рдм' рд╕реЗ рдЖрдпрд╛рдд {рдЕрдХреЙрд░реНрдбрд┐рдпрди};
'react-lib' рд╕реЗ {AcordionItem} рдЖрдпрд╛рдд рдХрд░реЗрдВ;
```

рд░рд┐рдПрдХреНрдЯ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг, рдмреНрд░рд╛рдЙрдЬрд╝рд░ / рдУрдПрд╕ рдЗрд╕ рдореБрджреНрджреЗ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реИрдВ:

  • рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЛрдо: рджреЛрдиреЛрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-lib рдФрд░ myapp рджреЛрдиреЛрдВ рдкрд░ ^16.8.6
  • рдмреНрд░рд╛рдЙрдЬрд╝рд░: рдмрд╣рд╛рджреБрд░ Version 0.61.52 Chromium: 73.0.3683.86 (Official Build) (64-bit)
  • рдУрдПрд╕: рдореИрдХреЛрдЬрд╝ рд╣рд╛рдИ рд╕рд┐рдПрд░рд╛ Version 10.13.6 (17G5019)
Needs Investigation

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдореЗрд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдФрд░ рдХреНрд░рд┐рдПрдЯ-рд░рд┐рдПрдХреНрд╢рди-рдРрдк рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╣реИрдВ рдФрд░ рдореИрдВ npm рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ

рдХреНрдпрд╛ рдЖрдкрдиреЗ рдпрд╣ рднрд╛рдЧ рдкрдврд╝рд╛?

https://reactjs.org/warnings/invalid-hook-call-warning.html#duplicate -react

рдпрд╣ рд╕реАрдзреЗ link рдХрд╛рд░реНрдпрдкреНрд░рд╡рд╛рд╣ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ:

Screen Shot 2019-04-04 at 09 28 47

рд╕рднреА 61 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк https://github.com/facebook/react/issues/13991 рдореЗрдВ рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рдорд╛рди рдореБрджреНрджреЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЖрдк рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ?

рдРрд╕рд╛ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдореИрдВ рдПрдЪрдУрд╕реА рдХреЗ рдЕрдВрджрд░ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред

const HOC = Component => {
  return (props) => {
    const [val] = useState();
    return <div>{val}</div>
  }
}

@ revskill10 рдХреГрдкрдпрд╛

рдореИрдВ рдЖрдкрдХреЛ https://www.npmjs.com/package/webpack-bundle-analyzer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреВрдВрдЧрд╛

рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЕрдХреНрд╕рд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЛрдо рдХреЛ рдореВрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ рдЬреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреЛ рдмрд┐рд▓реНрдб рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рдореБрджреНрджреЗ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВред

рдЕрдЧрд░ рдРрд╕рд╛ рд╣реИ рддреЛ рдХреЗрд╡рд▓ npm рд▓рд┐рдВрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЛрдо рдХреЗ рдореВрд▓ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЛрдо рдХреА рддреБрд▓рдирд╛ рдореЗрдВред

рдореЗрд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдФрд░ рдХреНрд░рд┐рдПрдЯ-рд░рд┐рдПрдХреНрд╢рди-рдРрдк рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╣реИрдВ рдФрд░ рдореИрдВ npm рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ

рдХреНрдпрд╛ рдЖрдкрдиреЗ рдпрд╣ рднрд╛рдЧ рдкрдврд╝рд╛?

https://reactjs.org/warnings/invalid-hook-call-warning.html#duplicate -react

рдпрд╣ рд╕реАрдзреЗ link рдХрд╛рд░реНрдпрдкреНрд░рд╡рд╛рд╣ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ:

Screen Shot 2019-04-04 at 09 28 47

(рдЕрдЧрд░ рдпрд╣ рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рддреЛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдФрд░ рд╣рдо рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рд╡рд┐рд╕реНрддреГрдд рд▓реЗрдЦрди рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВред)

рдзрдиреНрдпрд╡рд╛рдж, рдкрд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдХреЛ

@gaearon рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреГрд╖реНрда рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдерд╛ рдФрд░ рдкреБрдирдГ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдерд╛:

рдореИрдВрдиреЗ рдЗрди рд╕рднреА рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рдЕрднреА рднреА рд╡рд╣реА рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИред

@threepointone рдХрд╛рдлреА рдордЬрд╝реЗрджрд╛рд░ рд╣реИ, рдЗрддрдиреЗ рд╕рд╛рд░реЗ рд▓реЛрдЧреЛрдВ рдиреЗ рдЗрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди # 13991 рдкрд░ рдкрд╛рдпрд╛ рд╣реИ рдФрд░ рдореИрдВрдиреЗ рдмрд╛рдХреА рдХрд▓ рдЙрдиреНрд╣реЗрдВ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдлрд▓рддрд╛ рдХреЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдмрд┐рддрд╛рдпрд╛ рд╣реИред

рдареАрдХ рд╣реИ, рдЕрдЧрд░ рдЗрд╕рд╕реЗ рдорджрдж рдирд╣реАрдВ рдорд┐рд▓реА рддреЛ рдЗрд╕реЗ рдЦреБрд▓рд╛ рдЫреЛрдбрд╝ рджреЗрдВ рддрд╛рдХрд┐ рдХреЛрдИ рдЖрдкрдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдбреАрдмрдЧ рдХрд░ рд╕рдХреЗ рдФрд░ рдЖрдкрдХреА рдорджрдж рдХрд░ рд╕рдХреЗред рд╕рдорд╕реНрдпрд╛ _is_ рд╡рд╣реА рд╣реИ (рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЖрдк рдкреИрдХреЗрдЬ рд▓рд┐рдВрдХ рдХрд░рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдмрдВрдбрд▓ рдореЗрдВ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕реБрдЭрд╛рд╡ рдЖрдкрдХреЗ рд▓рд┐рдП рдХреНрдпреЛрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

@gaearon рдЕрдм рдЖрдк рдЗрд╕реЗ рдмрдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдКрдкрд░ рджрд┐рдП рдЧрдП рд╕рдорд╛рдзрд╛рди рдиреЗ рдХрд╛рдо рдХрд┐рдпрд╛ред

рдореИрдВ рд╕рд┐рд░реНрдл рд╣реБрдХ рдХреЛ рдмрд╣реБрдд рд╣реА рдмреБрдирд┐рдпрд╛рджреА рддрд░реАрдХреЗ рд╕реЗ рдмреБрд▓рд╛рддрд╛ рд╣реВрдВред

import React, {useState} from 'react'
import ReactDOM from 'react-dom'

function App() {
const [number, setNumber] = useState(0);
const increase = () => {
    setNumber(number+1);
}
return <div>
<span>Counting: {number}</span>
<button onClick={increase} >Increase</button>
</div>
}

const selector = document.getElementById('app');

ReactDOM.render(<App />, selector);

рдореБрдЭреЗ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ
Hooks can only be called inside of the body of a function component.
рдореИрдВрдиреЗ рд╕реНрдХреЗрдЪ рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд░рд┐рдПрдХреНрдЯ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдП рд╣реИрдВ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рдкрд╣рд▓реЗ рдХрднреА рдирд╣реАрдВ рдорд┐рд▓реАред
рдореИрдВ рд╣реБрдХ рдХреЗ рд╕рднреА рдирд┐рдпрдореЛрдВ рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВред
рдореИрдВ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 12 рдШрдВрдЯреЗ рдХрд╛ рд╕рдордп рдмрд┐рддрд╛рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдореИрдВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдЕрдм рдореБрдЭреЗ рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИред

// Add this in node_modules/react-dom/index.js
window.React1 = require('react');

// Add this in your component file
require('react-dom');
window.React2 = require('react');
console.log(window.React1 === window.React2); // I get true

@xeastcrast рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдереЗ?

@carlosriveros
рдорд╛рдорд▓рд╛ рдПрдХ:
рдЖрдк рдЕрдкрдиреЗ index.html рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЯреИрдЧ рдмрдВрдбрд▓ рд╣реИ

рдпрджрд┐ рдЖрдкрдХреЛ index.html рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╡рд╣реА рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ
рдХреЗрд╕ 2:
рдпрджрд┐ рдЖрдк Webpack html рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ webpack.config рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрджрд░ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдЧреБрдг рдореЗрдВ
рдФрд░ рдирдП HTMLWebpackPlugin() рдХреЗ рд╡рд┐рдХрд▓реНрдк рдореЗрдВ {reject: true} рдирд╣реАрдВ рд╣реИ;

рдЖрдкрдХреЛ index.html . рдореЗрдВ рдЕрдкрдиреЗ рдмрдВрдбрд▓ рдореЗрдВ рдореМрдЬреВрдж рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЯреИрдЧ рдХреЛ рд╣рдЯрд╛рдирд╛ рд╣реЛрдЧрд╛

рдХреНрдпреЛрдВрдХрд┐ HTMLWebpackPlugin рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЯреИрдЧ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдХреА рдмрдВрдбрд▓ рдлрд╝рд╛рдЗрд▓ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧреАред

рдирдорд╕реНрддреЗ, рдореИрдВ рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рд╣реВрдБред рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕рд░реНрдЪ рдмрд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рд╕рд╛рдордЧреНрд░реА-рдпреВрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИред рдореИрдВрдиреЗ рдпрд╣ рдХреЛрдб рд▓рд┐рдЦрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдПрдХ рд╣реА рдореБрджреНрджрд╛ рджреЗ рд░рд╣рд╛ рд╣реИред рдореИрдВрдиреЗ рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рдбреЙрдХреНрд╕ рдкрдврд╝рд╛ рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдорд┐рд▓рд╛ред
REACTJS рдХреЛрдб
``` 'рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛' рд╕реЗ рдЖрдпрд╛рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛;
'@material-ui/core/styles' рд╕реЗ {makeStyles} рдЖрдпрд╛рдд рдХрд░реЗрдВ;
'@ рд╕рд╛рдордЧреНрд░реА-рдпреВрдЖрдИ/рдХреЛрд░/рдкреЗрдкрд░' рд╕реЗ рдкреЗрдкрд░ рдЖрдпрд╛рдд рдХрд░реЗрдВ;
'@ рд╕рд╛рдордЧреНрд░реА-рдпреВрдЖрдИ/рдХреЛрд░/рдЗрдирдкреБрдЯрдмреЗрд╕' рд╕реЗ рдЗрдирдкреБрдЯрдмреЗрд╕ рдЖрдпрд╛рдд рдХрд░реЗрдВ;
'@ material-ui/core/IconButton' рд╕реЗ IconButton рдЖрдпрд╛рдд рдХрд░реЗрдВ;
'@ рд╕рд╛рдордЧреНрд░реА-рдпреВрдЖрдИ/рдЖрдЗрдХрди/рдЦреЛрдЬ' рд╕реЗ SearchIcon рдЖрдпрд╛рдд рдХрд░реЗрдВ;

рдХреЙрдиреНрд╕реНрдЯ рдпреВрдЬ рд╕реНрдЯрд╛рдЗрд▓реНрд╕ = рдореЗрдХ рд╕реНрдЯрд╛рдЗрд▓реНрд╕ ({
рдЬрдбрд╝: {
рдкреИрдбрд┐рдВрдЧ: '2px 4px',
рдкреНрд░рджрд░реНрд╢рди: 'рдлреНрд▓реЗрдХреНрд╕',
рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░реЗрдВ: 'рдХреЗрдВрджреНрд░',
рдЪреМрдбрд╝рд╛рдИ: 400,
},
рдЗрдирдкреБрдЯ: {
рдорд╛рд░реНрдЬрд┐рди рд▓реЗрдлреНрдЯ: 8,
рдлреНрд▓реЗрдХреНрд╕: 1,
},
рдЖрдЗрдХрдирдмрдЯрди: {
рдкреИрдбрд┐рдВрдЧ: 10,
},
рд╡рд┐рднрдХреНрдд: {
рдЪреМрдбрд╝рд╛рдИ: 1,
рдКрдВрдЪрд╛рдИ: 28,
рдорд╛рд░реНрдЬрд┐рди: 4,
},
});

рдлрд╝рдВрдХреНрд╢рди рдлрд╝реАрдЪрд░ () {
рдХреЙрдиреНрд╕реНрдЯ рдХреНрд▓рд╛рд╕реЗрд╕ = рдпреВрдЬрд╝ рд╕реНрдЯрд╛рдЗрд▓реНрд╕ ();

рд╡рд╛рдкрд╕реА (





);
}

рдирд┐рд░реНрдпрд╛рдд рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реБрд╡рд┐рдзрд╛;

**PACKAGE.JSON**
```{
  "name": "builder-frontend",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@material-ui/core": "^4.0.1",
    "@material-ui/docs": "^3.0.0-alpha.9",
    "@material-ui/icons": "^4.0.0",
    "@material-ui/styles": "^4.0.1",
    "react": "^16.8.5",
    "react-dom": "^16.8.5",
    "react-redux": "^6.0.1",
    "react-router-dom": "^5.0.0",
    "react-scripts": "2.1.8",
    "redux": "^4.0.1",
    "styled-components": "^4.2.0"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": "react-app"
  },
  "browserslist": [
    ">0.2%",
    "not dead",
    "not ie <= 11",
    "not op_mini all"
  ]
}

рд╕рдВрд╕реНрдХрд░рдг

  • рдиреЛрдб - v10.15.3
  • рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ -- ^16.8.5
  • рд╕рд╛рдордЧреНрд░реА-рдпреВрдЖрдИ -- ^4.0.1

рдЕрдкреЗрдХреНрд╖рд┐рдд рдкрд░рд┐рдгрд╛рдо

  • рдмрд┐рд▓реНрдЯ-рдЗрди VS CODE рдФрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд _A рд╕рд░реНрдЪ рдмрд╛рд░_
    рдЖрдЙрдЯрдкреБрдЯ
    _рдЯрд╛рдЗрдк рдПрд░рд░: рдСрдмреНрдЬреЗрдХреНрдЯ (...) рдПрдХ рдлрдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИ_
    _рдЕрдорд╛рдиреНрдп рд╣реБрдХ рдХреЙрд▓ред рд╣реБрдХ рдХреЛ рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рдШрдЯрдХ рдХреЗ рд╢рд░реАрд░ рдХреЗ рдЕрдВрджрд░ рд╣реА рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдирд┐рдореНрди рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХрд╛рд░рдг рд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:_

рдкреНрд░рдпрддреНрди
_CODESANDBOX рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ , рд╕рдм рдХреБрдЫ рдареАрдХ рдЪрд▓рддрд╛ рд╣реИ_ рдЗрд╕реЗ рдЬрд╛рдВрдЪреЗрдВ ред

рдирдорд╕реНрддреЗ, рдореИрдВ рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рд╣реВрдБред рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕рд░реНрдЪ рдмрд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рд╕рд╛рдордЧреНрд░реА-рдпреВрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИред рдореИрдВрдиреЗ рдпрд╣ рдХреЛрдб рд▓рд┐рдЦрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдПрдХ рд╣реА рдореБрджреНрджрд╛ рджреЗ рд░рд╣рд╛ рд╣реИред рдореИрдВрдиреЗ рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рдбреЙрдХреНрд╕ рдкрдврд╝рд╛ рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдорд┐рд▓рд╛ред
REACTJS рдХреЛрдб

import { makeStyles } from '@material-ui/core/styles';
import Paper from '@material-ui/core/Paper';
import InputBase from '@material-ui/core/InputBase';
import IconButton from '@material-ui/core/IconButton';
import SearchIcon from '@material-ui/icons/Search';

const useStyles = makeStyles({
  root: {
    padding: '2px 4px',
    display: 'flex',
    alignItems: 'center',
    width: 400,
  },
  input: {
    marginLeft: 8,
    flex: 1,
  },
  iconButton: {
    padding: 10,
  },
  divider: {
    width: 1,
    height: 28,
    margin: 4,
  },
});

function Feature() {
    const classes = useStyles();

  return (
    <Paper className={classes.root}>
      <InputBase className={classes.input} placeholder="Search Google Maps" />
      <IconButton className={classes.iconButton} aria-label="Search">
        <SearchIcon />
      </IconButton>
    </Paper>
  );
}

export default Feature;

рдкреИрдХреЗрдЬ.JSON

  "name": "builder-frontend",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@material-ui/core": "^4.0.1",
    "@material-ui/docs": "^3.0.0-alpha.9",
    "@material-ui/icons": "^4.0.0",
    "@material-ui/styles": "^4.0.1",
    "react": "^16.8.5",
    "react-dom": "^16.8.5",
    "react-redux": "^6.0.1",
    "react-router-dom": "^5.0.0",
    "react-scripts": "2.1.8",
    "redux": "^4.0.1",
    "styled-components": "^4.2.0"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": "react-app"
  },
  "browserslist": [
    ">0.2%",
    "not dead",
    "not ie <= 11",
    "not op_mini all"
  ]
}

рд╕рдВрд╕реНрдХрд░рдг

  • рдиреЛрдб - v10.15.3
  • рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ -- ^16.8.5
  • рд╕рд╛рдордЧреНрд░реА-рдпреВрдЖрдИ -- ^4.0.1

рдЕрдкреЗрдХреНрд╖рд┐рдд рдкрд░рд┐рдгрд╛рдо

  • рдмрд┐рд▓реНрдЯ-рдЗрди VS CODE рдФрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд _A рд╕рд░реНрдЪ рдмрд╛рд░_
    рдЖрдЙрдЯрдкреБрдЯ
    _рдЯрд╛рдЗрдк рдПрд░рд░: рдСрдмреНрдЬреЗрдХреНрдЯ (...) рдПрдХ рдлрдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИ_
    _рдЕрдорд╛рдиреНрдп рд╣реБрдХ рдХреЙрд▓ред рд╣реБрдХ рдХреЛ рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рдШрдЯрдХ рдХреЗ рд╢рд░реАрд░ рдХреЗ рдЕрдВрджрд░ рд╣реА рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдирд┐рдореНрди рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХрд╛рд░рдг рд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:_

рдкреНрд░рдпрддреНрди
_CODESANDBOX рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ , рд╕рдм рдХреБрдЫ рдареАрдХ рдЪрд▓рддрд╛ рд╣реИ_ рдЗрд╕реЗ рдЬрд╛рдВрдЪреЗрдВ ред

рд╕рд╛рдордЧреНрд░реА-рдпреВрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдореИрдВ рдпрд╣ рдкреНрд░рд╢реНрди рднреА рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реВрдВред

@stupidsongshu , рддреЛ рдЖрдкрдиреЗ рдЗрд╕реЗ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛?

рдирдорд╕реНрддреЗ, рдореИрдВ рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рд╣реВрдБред рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕рд░реНрдЪ рдмрд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рд╕рд╛рдордЧреНрд░реА-рдпреВрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИред рдореИрдВрдиреЗ рдпрд╣ рдХреЛрдб рд▓рд┐рдЦрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдПрдХ рд╣реА рдореБрджреНрджрд╛ рджреЗ рд░рд╣рд╛ рд╣реИред рдореИрдВрдиреЗ рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рдбреЙрдХреНрд╕ рдкрдврд╝рд╛ рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдорд┐рд▓рд╛ред
REACTJS рдХреЛрдб

import { makeStyles } from '@material-ui/core/styles';
import Paper from '@material-ui/core/Paper';
import InputBase from '@material-ui/core/InputBase';
import IconButton from '@material-ui/core/IconButton';
import SearchIcon from '@material-ui/icons/Search';

const useStyles = makeStyles({
  root: {
    padding: '2px 4px',
    display: 'flex',
    alignItems: 'center',
    width: 400,
  },
  input: {
    marginLeft: 8,
    flex: 1,
  },
  iconButton: {
    padding: 10,
  },
  divider: {
    width: 1,
    height: 28,
    margin: 4,
  },
});

function Feature() {
    const classes = useStyles();

  return (
    <Paper className={classes.root}>
      <InputBase className={classes.input} placeholder="Search Google Maps" />
      <IconButton className={classes.iconButton} aria-label="Search">
        <SearchIcon />
      </IconButton>
    </Paper>
  );
}

export default Feature;

рдкреИрдХреЗрдЬ.JSON

  "name": "builder-frontend",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@material-ui/core": "^4.0.1",
    "@material-ui/docs": "^3.0.0-alpha.9",
    "@material-ui/icons": "^4.0.0",
    "@material-ui/styles": "^4.0.1",
    "react": "^16.8.5",
    "react-dom": "^16.8.5",
    "react-redux": "^6.0.1",
    "react-router-dom": "^5.0.0",
    "react-scripts": "2.1.8",
    "redux": "^4.0.1",
    "styled-components": "^4.2.0"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": "react-app"
  },
  "browserslist": [
    ">0.2%",
    "not dead",
    "not ie <= 11",
    "not op_mini all"
  ]
}

рд╕рдВрд╕реНрдХрд░рдг

  • рдиреЛрдб - v10.15.3
  • рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ -- ^16.8.5
  • рд╕рд╛рдордЧреНрд░реА-рдпреВрдЖрдИ -- ^4.0.1

рдЕрдкреЗрдХреНрд╖рд┐рдд рдкрд░рд┐рдгрд╛рдо

  • рдмрд┐рд▓реНрдЯ-рдЗрди VS CODE рдФрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд _A рд╕рд░реНрдЪ рдмрд╛рд░_
    рдЖрдЙрдЯрдкреБрдЯ
    _рдЯрд╛рдЗрдк рдПрд░рд░: рдСрдмреНрдЬреЗрдХреНрдЯ (...) рдПрдХ рдлрдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИ_
    _рдЕрдорд╛рдиреНрдп рд╣реБрдХ рдХреЙрд▓ред рд╣реБрдХ рдХреЛ рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рдШрдЯрдХ рдХреЗ рд╢рд░реАрд░ рдХреЗ рдЕрдВрджрд░ рд╣реА рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдирд┐рдореНрди рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХрд╛рд░рдг рд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:_

рдкреНрд░рдпрддреНрди
_CODESANDBOX рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ , рд╕рдм рдХреБрдЫ рдареАрдХ рдЪрд▓рддрд╛ рд╣реИ_ рдЗрд╕реЗ рдЬрд╛рдВрдЪреЗрдВ ред

рдпрд╣ рдЖрдЬ рдореЗрд░реЗ рд▓рд┐рдП рдЦреБрд╢реА рдХреА рдмрд╛рдд рд╣реИ рдФрд░ рдореИрдВ рд╕рд┐рд░реНрдл npm install --save React -dom@latest . рдЪрд▓рд╛рддрд╛ рд╣реВрдВ

https://reactjs.org/warnings/invalid-hook-call-warning.html#duplicate -react

рдореИрдВрдиреЗ рд╕рд╣рд╛рдпрддрд╛ рдкреГрд╖реНрда рдореЗрдВ рджрд┐рдП рдЧрдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЗрд╕рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реБрдЖ

рдореЗрд░реЗ рд▓рд┐рдП, рд╣рдордиреЗ рдЗрд╕реЗ рдХреЗрд╡рд▓ рд░рд┐рдПрдХреНрдЯ рдХреЛ рдПрдХ рдкреНрд░реЛрдк рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рдХреЗ рдЗрд╕реЗ рдЕрднреА рдХреЗ рд▓рд┐рдП рд╣рд▓ рдХрд┐рдпрд╛ рд╣реИред рдпрд╣ рдПрдХ рдРрдк рдФрд░ рдЕрд▓рдЧ рдореЙрдбреНрдпреВрд▓ рд╣реИ рдЬрд┐рд╕ рдкрд░ рд╣рдорд╛рд░рд╛ рдкреВрд░рд╛ рдирд┐рдпрдВрддреНрд░рдг рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рд╕рднреА рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдЗрд╕рдиреЗ рдореЗрд░реА рднреА рдорджрдж рдирд╣реАрдВ рдХреА ..
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЛрдо = 16.8.0 рдФрд░ рд╕рд╛рдордЧреНрд░реА-рдпреВрдЖрдИ = 4.1.3 . рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рдореИрдВ рдЗрд╕ рд╣реБрдХ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд╛рд╣рд░реА lib рд╕реЗ рдХрд┐рд╕реА рдШрдЯрдХ рдХрд╛ рдХреЛрдИ рднреА рдЖрдпрд╛рдд рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ 2 рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ (рдПрдХ lib рд╕реЗ, рдПрдХ рдореЗрд░реЗ рдРрдк рд╕реЗ)ред

рдореИрдВрдиреЗ рд╕рднреА рд╕реБрдЭрд╛рд╡реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ рд╣реИ, рдЕрдм рддрдХ рдХреБрдЫ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред рдореИрдВ рдПрдХ рд░рд╛рдЬреНрдп рдХреЗ рд╕рд╛рде рдШрдЯрдХ рдмрдирд╛рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ рдЬрдм рддрдХ рдХрд┐ рдЗрд╕реЗ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ ...

рдпрд╣рд╛рдВ рд╡рд╣реА рдореБрджреНрджрд╛ред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╡рд╛рд▓рд╛ рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИред рдПрдХ lib рдФрд░ рдПрдХ app рдЬреЛ lib рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдореИрдВ yarn.lock , package-lock.json , node_modules , dist , рдХреИрд╢ рдХреА рддрд░рд╣ рдХреЛ рд╣рдЯрд╛рдХрд░ рд╣рд▓ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдлрд╛рдЗрд▓реЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдлрд┐рд░ yarn рдпрд╛ npm install рдЪрд▓рд╛рддрд╛ yarn npm install рдлрд┐рд░ рд╕реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдЕрдм рдпрд╣ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ!

рдореИрдВ рдЗрд╕реЗ рдкрд░рд┐рд╡рд░реНрддрди рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд░рддрд╛ рд╣реВрдВ

                <Route key={index} render={route.component} path={route.path} />

рдкреНрд░рддрд┐

                <Route key={index} component={route.component} path={route.path} />

рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХреНрдпреЛрдВ :(

рдЧрд▓рддреА рд╕реЗ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдХрдВрдкреЛрдиреЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд┐рдХреНрд╕реНрдбред рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЧрд╛рдЗрдб рдиреЗ рдЗрд╕ рдкрд░рд┐рджреГрд╢реНрдп рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд┐рдпрд╛ред
рдзрдиреНрдпрд╡рд╛рдж, xyj404
<Route path="/login" exact component={LoginForm} />

рдореБрдЭреЗ рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рдереА рд▓реЗрдХрд┐рди рдХрд╛рд░рдг рдЕрд▓рдЧ рдерд╛ред рдСрдЯреЛ-рдЗрдореНрдкреЛрд░реНрдЯ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдпрд╛ рд╕реНрдирд┐рдкреЗрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдЙрд╕реА рдХреЗрд╕ рд░рд┐рдПрдХреНрдЯ рд╕реЗ рдЗрдореНрдкреЛрд░реНрдЯ рдХрд░рддреЗ рд╣реИрдВред

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ import {useEffect} from 'react' рдФрд░ import {useEffect} from 'React' рддреЛ рдЖрдк рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░реЗрдВрдЧреЗред

рдореБрдЭреЗ рднреА рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕реНрдЯреЛрд░реАрдмреБрдХ рдореЗрдВ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдпрд╣ рд╡рд╣реА рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ

рд╡рд╣реА рд╕рдорд╕реНрдпрд╛ рднреА рдХрд╛рдо рдХрд░рддреА рд╣реИ
рд╕реНрдЯреЛрд░реАрдмреБрдХ рдореЗрдВ рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдРрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рд╣реЛ рдЬрд╛рддреА рд╣реИ

рд╡рд╣реА рддреНрд░реБрдЯрд┐, рдЬрдм рдореИрдВ npm test рдЪрд▓рд╛рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдпрд╣ рдорд┐рд▓рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдРрдк рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рд░рд╣рд╛ рдореЗрд░рд╛ package.json , рдХреЛрдИ рд╕реБрдЭрд╛рд╡? рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдлрдВрд╕ рдЧрдпрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдореЗрдВ рд╕рдордп рдмрд░реНрдмрд╛рдж рдХрд░ рд░рд╣рд╛ рд╣реВрдВ

{
  "name": "myproject",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@date-io/moment": "1.0.1",
    "@material-ui/core": "^3.9.3",
    "@material-ui/icons": "^3.0.1",
    "animate.css": "^3.7.0",
    "aws-amplify": "^0.4.8",
    "aws-amplify-react": "^0.1.54",
    "axios": "^0.18.0",
    "file-saver": "^2.0.0",
    "ics-js": "^0.10.2",
    "material-ui-pickers": "2.1.1",
    "moment": "^2.23.0",
    "normalize.css": "^8.0.1",
    "react": "^16.8.6",
    "react-app-polyfill": "^1.0.0",
    "react-date-range": "^1.0.0-beta",
    "react-dom": "^16.8.6",
    "react-google-maps": "^9.4.5",
    "react-jss": "^8.6.1",
    "react-router": "^4.3.1",
    "react-router-dom": "^4.3.1",
    "react-scripts": "3.0.1",
    "recharts": "^1.3.5",
    "redux": "^4.0.1",
    "styled-components": "^4.2.0",
    "sweetalert2": "^7.33.1",
    "sweetalert2-react-content": "^1.0.1"
  },
  "scripts": {
    "start:dev": "node  -r dotenv/config ./node_modules/react-scripts/bin/react-scripts start dotenv_config_path=./env/development.env",
    "start:stage": "node -r dotenv/config ./node_modules/react-scripts/bin/react-scripts start dotenv_config_path=./env/stage.env",
    "start:prod": "node -r dotenv/config ./node_modules/react-scripts/bin/react-scripts start dotenv_config_path=./env/production.env",
    "build:stage": "node --max_old_space_size=2048 --max_old_space_size=1024 -r dotenv/config ./node_modules/.bin/react-scripts build dotenv_config_path=./env/stage.env",
    "build:dev": "node --max_old_space_size=2048 -r dotenv/config ./node_modules/react-scripts/bin/react-scripts build dotenv_config_path=./env/development.env",
    "build:prod": "node --max_old_space_size=2048 -r dotenv/config ./node_modules/react-scripts/bin/react-scripts build dotenv_config_path=./env/production.env",
    "test": "node -r dotenv/config ./node_modules/.bin/react-scripts test dotenv_config_path=./env/development.env --runInBand",
    "eject": "react-scripts eject"
  },
  "devDependencies": {
    "@testing-library/jest-dom": "^4.0.0",
    "@testing-library/react": "^8.0.5",
    "@testing-library/react-hooks": "^1.1.0",
    "dotenv": "^6.0.0",
    "prettier": "^1.15.3",
    "react-test-renderer": "^16.8.6"
  },
  "browserslist": [
    ">0.2%",
    "not dead",
    "not ie <= 11",
    "not op_mini all"
  ]
}

рдПрдирдкреАрдПрдо рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рдПрдХ рдЕрд▓рдЧ рдРрдк рдореЗрдВ makeStyles рд╣реБрдХ рд╕реЗ @material-ui/core рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЛрдо рджреЛрдиреЛрдВ v16.8.6 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рднрд╛рдЧ рд▓рд┐рдпрд╛ред

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЛрдо v16.9.0 рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдРрдк рдХреЛ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдФрд░ рдЙрд╕ рдРрдк рдХреЛ рдлрд┐рд░ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж рдЬреЛ рд╕рдорд╕реНрдпрд╛ рдкреИрджрд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛, рд╕рдм рдХреБрдЫ рдлрд┐рд░ рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред

рд╣рд╛рдБ, рдЬрдм рдореИрдВ @ рд╕рд╛рдордЧреНрд░реА-рдпреВрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдереАред рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИред рдлрд┐рд░ рдореИрдВрдиреЗ рдЧреВрдЧрд▓ рдкрд░ рд╕рд░реНрдЪ рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕рдХрд╛ рд╣рд▓ рдвреВрдВрдврд╛ред рдпрд╣ рдпрд╣рд╛рдБ рд╣реИ http://putridparrot.com/blog/react-material-ui-invalid-hook-call-hooks-can-only-be-call-inside-of-the-body-of-a-function-component/

рдореВрд▓ рдкреЛрд╕реНрдЯ:

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рднреАрддрд░ рд╕рд╛рдордЧреНрд░реА рдпреВрдЖрдИ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдФрд░ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╕рдордп (рдПрдХ .tsx рдлрд╝рд╛рдЗрд▓ рдХреЗ рднреАрддрд░ рд╕рдЯреАрдХ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП) рдЖрдкрдХреЛ рд░рдирдЯрд╛рдЗрдо рдкрд░ "рдЕрдорд╛рдиреНрдп рд╣реБрдХ рдХреЙрд▓" рдЬреИрд╕реА рддреНрд░реБрдЯрд┐ рдЖ рд╕рдХрддреА рд╣реИред рд╣реБрдХ рдХреЛ рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рдШрдЯрдХ рдХреЗ рд╢рд░реАрд░ рдХреЗ рдЕрдВрджрд░ рд╣реА рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ"ред

рдпрд╣рд╛рдВ рдХреЛрдб рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ

import React, { Component }  from "react";
import AddIcon from "@material-ui/icons/Add";
import { Fab } from "@material-ui/core";
import { makeStyles } from "@material-ui/core/styles";

const useStyles = makeStyles(theme => ({
   fab: {
      margin: theme.spacing(1),
   },
}));

const classes = useStyles();

export default class SampleComponent extends Component<{}, {}> {
   public render() {
      return (
         <div>
            <Fab color="primary" aria-label="Add" className={classes.fab}><AddIcon /></Fab>
         </div>
       );
   }
}

рд╣рдореЗрдВ рдЬреЛ рдХрд░рдирд╛ рд╣реИ рд╡рд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ useStyles рдХреЛрдб рдХреЛ рд▓рдкреЗрдЯрдирд╛ рд╣реИ рдФрд░ рдЙрд╕ рдХреЛрдб рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реИ рдЬреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП

const SampleFab = () => {
   const classes = useStyles();
   return <Fab color="primary" aria-label="Add" className={classes.fab}><AddIcon /></Fab>;
}

export default class SampleComponent extends Component<{}, {}> {
   public render() {
      return (
         <div>
            <SampleFab />
         </div>
      );
   }
}

рдЗрд╕рд╕реЗ рдпрд╣ рднреА рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рд╣рдо рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рдШрдЯрдХ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

=> рдпрд╣ рдкрд╛рдЧрд▓ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдк рдореЗрд░реЗ рдЬреИрд╕реЗ рд▓рд░реНрди рдпрд╛ рдореЛрдиреЛрд░реЗрдкреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЕрдкрдиреЗ рд╡реЗрдмрдкреИрдХ рд╕рдорд╛рдзрд╛рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдЗрд╕ рддрд░рд╣ sth рдЬреЛрдбрд╝реЗрдВ

...
    alias: {
      'react-dom': 'path/to/main-package/node_modules/react-dom',
      react: 'path/to/main-package/form/node_modules/react',
    }
...

рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рд╕реНрдЯреЛрд░реАрдмреБрдХ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рд╡рд╣рд╛рдВ рдХрд╕реНрдЯрдо рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рднреА рдЬреЛрдбрд╝реЗрдВред

рдПрдХ рд╕рд╛рдЗрдб рдиреЛрдЯ, рдпрджрд┐ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЗ рд╡реЗрдмрдкреИрдХ рдирд┐рд░реНрдорд┐рдд рдмрдВрдбрд▓ рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ 2 рд╕рдВрд╕реНрдХрд░рдг рднреА рдереЗ (рдЗрд╕рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реЗрдмрдкреИрдХ рдмрдВрдбрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреА рддрд░рд╣ sth рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ)ред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореЗрд░реЗ рдореЛрдиреЛрд░реЗрдкреЛ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдкреИрдХреЗрдЬ рдерд╛ рдЬреЛ рдмрдВрдбрд▓рд┐рдВрдЧ рдФрд░ рд╕рднреА рдЯреВрд▓рд┐рдВрдЧ рдХрд╛ рдЦреНрдпрд╛рд▓ рд░рдЦрддрд╛ рдерд╛ рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЙрдкрдирд╛рдо рдЬреЛрдбрд╝рдирд╛ рдкрдбрд╝рд╛ред

рдпрджрд┐ рдЖрдк рдореЗрд░реЗ рдЬреИрд╕реЗ рд▓рд░реНрди рдпрд╛ рдореЛрдиреЛрд░реЗрдкреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЕрдкрдиреЗ рд╡реЗрдмрдкреИрдХ рд╕рдорд╛рдзрд╛рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдЗрд╕ рддрд░рд╣ sth рдЬреЛрдбрд╝реЗрдВ

...
    alias: {
      'react-dom': 'path/to/main-package/node_modules/react-dom',
      react: 'path/to/main-package/form/node_modules/react',
  }
...

рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рд╕реНрдЯреЛрд░реАрдмреБрдХ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рд╡рд╣рд╛рдВ рдХрд╕реНрдЯрдо рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рднреА рдЬреЛрдбрд╝реЗрдВред

рдПрдХ рд╕рд╛рдЗрдб рдиреЛрдЯ, рдпрджрд┐ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЗ рд╡реЗрдмрдкреИрдХ рдирд┐рд░реНрдорд┐рдд рдмрдВрдбрд▓ рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ 2 рд╕рдВрд╕реНрдХрд░рдг рднреА рдереЗ (рдЗрд╕рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реЗрдмрдкреИрдХ рдмрдВрдбрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреА рддрд░рд╣ sth рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ)ред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореЗрд░реЗ рдореЛрдиреЛрд░реЗрдкреЛ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдкреИрдХреЗрдЬ рдерд╛ рдЬреЛ рдмрдВрдбрд▓рд┐рдВрдЧ рдФрд░ рд╕рднреА рдЯреВрд▓рд┐рдВрдЧ рдХрд╛ рдЦреНрдпрд╛рд▓ рд░рдЦрддрд╛ рдерд╛ рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЙрдкрдирд╛рдо рдЬреЛрдбрд╝рдирд╛ рдкрдбрд╝рд╛ред

рдзрдиреНрдпрд╡рд╛рдж, рдЗрд╕рд╕реЗ рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИ, рдореИрдВрдиреЗ рдЕрдкрдиреЗ docs рдбрд┐рдХреНрдЯреНрд░реА рдореЗрдВ рдПрдХ рдФрд░ рд░рд┐рдПрдХреНрдЯ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛, рдЬрд┐рд╕рд╕реЗ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣реБрдИред

рдореИрдВ рд╕рд┐рд░реНрдл рд╣реБрдХ рдХреЛ рдмрд╣реБрдд рд╣реА рдмреБрдирд┐рдпрд╛рджреА рддрд░реАрдХреЗ рд╕реЗ рдмреБрд▓рд╛рддрд╛ рд╣реВрдВред

import React, {useState} from 'react'
import ReactDOM from 'react-dom'

function App() {
const [number, setNumber] = useState(0);
const increase = () => {
    setNumber(number+1);
}
return <div>
<span>Counting: {number}</span>
<button onClick={increase} >Increase</button>
</div>
}

const selector = document.getElementById('app');

ReactDOM.render(<App />, selector);

рдореБрдЭреЗ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ
Hooks can only be called inside of the body of a function component.
рдореИрдВрдиреЗ рд╕реНрдХреЗрдЪ рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд░рд┐рдПрдХреНрдЯ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдП рд╣реИрдВ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рдкрд╣рд▓реЗ рдХрднреА рдирд╣реАрдВ рдорд┐рд▓реАред
рдореИрдВ рд╣реБрдХ рдХреЗ рд╕рднреА рдирд┐рдпрдореЛрдВ рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВред
рдореИрдВ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 12 рдШрдВрдЯреЗ рдХрд╛ рд╕рдордп рдмрд┐рддрд╛рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдореИрдВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдЕрдм рдореБрдЭреЗ рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИред

// Add this in node_modules/react-dom/index.js
window.React1 = require('react');

// Add this in your component file
require('react-dom');
window.React2 = require('react');
console.log(window.React1 === window.React2); // I get true

рдЖрдкрдХреЗ рдкрд╛рд╕ рд░рд┐рдПрдХреНрдЯ рдФрд░ рд░рд┐рдПрдХреНрдЯ рдбреЛрдо рдХреЗ рдмреЗрдореЗрд▓ рд╕рдВрд╕реНрдХрд░рдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдХреЗ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИ рдереА

рдЬрдм рдореИрдВ рдЕрдкрдиреЗ рдШрдЯрдХ рдХреЛ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╕реЗ рдХреНрд▓рд╛рд╕рдлреБрд▓ рдШрдЯрдХ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рднреА рдорд┐рд▓рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди рдпрд╣рд╛рдВ рд╣реИ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рднреА рдорджрдж рдХрд░рддрд╛ рд╣реИред

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЙрдЪреНрдЪ рдХреНрд░рдо рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ

'рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛' рд╕реЗ рдЖрдпрд╛рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛;
'рдкреНрд░реЛрдк-рдкреНрд░рдХрд╛рд░' рд╕реЗ рдкреНрд░реЛрдкрдЯрд╛рдЗрдк рдЖрдпрд╛рдд рдХрд░реЗрдВ;
рдЖрдпрд╛рдд { withStyles } '@material-ui/styles' рд╕реЗ;
'@ рд╕рд╛рдордЧреНрд░реА-рдпреВрдЖрдИ/рдХреЛрд░/рдмрдЯрди' рд╕реЗ рдЖрдпрд╛рдд рдмрдЯрди;

рдХреЙрдиреНрд╕реНрдЯ рд╕реНрдЯрд╛рдЗрд▓ = рдереАрдо => ({
рдЬрдбрд╝: {
рдкреГрд╖реНрдарднреВрдорд┐: 'рд░реИрдЦрд┐рдХ-рдврд╛рд▓ (45deg, #FE6B8B 30%, #FF8E53 90%)',
рд╕реАрдорд╛: 0,
рд╕реАрдорд╛ рддреНрд░рд┐рдЬреНрдпрд╛: рей,
рдмреЙрдХреНрд╕рд╢реИрдбреЛ: '0 3px 5px 2px рдЖрд░рдЬреАрдмреАрдП (255, 105, 135, .3)',
рд░рдВрдЧ рд╕рдлреЗрдж',
рдКрдВрдЪрд╛рдИ: 48,
рдкреИрдбрд┐рдВрдЧ: '0 30px',
},
});

рдХреНрд▓рд╛рд╕ рд╣рд╛рдпрд░рдСрд░реНрдбрд░рдХрдВрдкреЛрдиреЗрдВрдЯ рд░рд┐рдПрдХреНрдЯ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдХреЙрдореНрдкреЛрдиреЗрдВрдЯ {

рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛(){
рдХрд╛рд╕реНрдЯ {рдХрдХреНрд╖рд╛рдПрдВ} = this.props;
рд╡рд╛рдкрд╕реА (

HighOrderComponent.propTypes = {
рдХрдХреНрд╖рд╛рдПрдВ: PropTypes.object.isRequired,
};

рд╕реНрдЯрд╛рдЗрд▓реНрд╕ (рд╢реИрд▓рд┐рдпреЛрдВ) (рд╣рд╛рдпрд░рдСрд░реНрдбрд░ рдХреЙрдореНрдкреЛрдиреЗрдВрдЯ) рдХреЗ рд╕рд╛рде рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд┐рд░реНрдпрд╛рдд рдХрд░реЗрдВ;

рдореИрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ рд╕реАрдЦ рд░рд╣рд╛ рд╣реВрдВ, рдореИрдВрдиреЗ рдРрдк() рдХреЛ рдЗрд╕ рддрд░рд╣ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рднреА рд╕рдорд╕реНрдпрд╛ рджреЗрдЦреА:

ReactDOM.render(App(), $("#root"));

рдореЗрд░рд╛ рддрд░реНрдХ рдпрд╣ рдерд╛ рдХрд┐ <App /> рдХреЗрд╡рд▓ рдРрдк рдШрдЯрдХ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд┐рдиреА рдЯреЗрдореНрдкрд▓реЗрдЯ рддреИрдпрд╛рд░ рдХрд░реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдореИрдВрдиреЗ рд╕реАрдзреЗ рдРрдк рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛, рдЬреЛ рдЬреЗрдПрд╕рдПрдХреНрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рджреЗрддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдПрдХ рдмрд╛рд░ рдЬрдм рдореИрдВрдиреЗ рд╕реЗрдЯрд╕реНрдЯреЗрдЯ () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛, рддреЛ рдпрд╣ рдЙрдкрд░реЛрдХреНрдд рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдХрд╛рд░рдг рдмрдирд╛ред <App /> рдмрджрд▓рдиреЗ рд╕реЗ рдпрд╣ рд╣рд▓ рд╣реЛ рдЧрдпрд╛ред

ReactDOM.render(<App />, $("#root"));

рдиреЛрдЯ: $ рд╕рд┐рд░реНрдл рдПрдХ рд╕рд╣рд╛рдпрдХ рд╣реИ const $ = sel => document.querySelector(sel);

рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рд╕рднреА рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕реБрдзрд╛рд░реЛрдВ рдХрд╛ рдирд┐рд╡рд╛рд░рдг рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рднреА рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рджреЛрдмрд╛рд░рд╛ рдЬрд╛рдВрдЪ рд▓реЗрдВ рдХрд┐ рдЖрдк рдЕрдкрдирд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЪрд▓рд╛рддреЗ рд╕рдордп рд╕рд╣реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдЖрд╡рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореБрдЭреЗ рдЕрдкрдиреЗ рдкреАрд╕реА рдкрд░ рд╕рдорд╕реНрдпрд╛рдПрдБ рдмрдиреА рд░рд╣реАрдВ рдФрд░ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдпрд╣реА рдХрд╛рд░рдг рд╣реИред

https://stackoverflow.com/questions/58365151/hooks-error-invalid-hook-call-using-nextjs-or-reactjs-on-windows

react-dom рдХреЛ рд╕рдВрд╕реНрдХрд░рдг 16.10.2 рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддреЗ рд╕рдордп рдореБрдЭреЗ рд╡рд╣ рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд░рд╣реА рдереАред enzyme-adapter-react-16 рдХреЛ 1.15.1 рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рд╕реЗ рдпрд╣ рдареАрдХ рд╣реЛ рдЧрдпрд╛

рдЕрд░реЗ рдпрд╛рд░ рдореИрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ v16.10.2 рдкрд░ рд╣реВрдБред рдореИрдВрдиреЗ рдЗрд╕рд╕реЗ рд▓рдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдореЗрдВ рдкрд╣рд▓реЗ рд╣реА рдХреБрдЫ рдШрдВрдЯреЗ рдмрд┐рддрд╛рдП рд▓реЗрдХрд┐рди рдореИрдВ рдЕрдм рдЗрд╕ рд▓рдбрд╝рд╛рдИ рдХреЛ рдЬрд╛рд░реА рдирд╣реАрдВ рд░рдЦреВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЪреАрдЬреЗрдВ рд╣реИрдВред рдореИрдВ рдЕрднреА рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдЕрдВрддрд┐рдо-рдлреЙрд░реНрдо 4.1.0 рдкрд░ рд░рд╣рдиреЗ рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реВрдВред рдХреНрдпрд╛ рд╣рддрд╛рд╢рд╛ рд╣реИред

рдЗрд╕рд╕реЗ рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИ:

https://github.com/facebook/create-react-app/issues/7676#issuecomment -531543375

рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рдХрдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдореЗрдВ рдШрдВрдЯреЛрдВ рдмрд┐рддрд╛рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдореБрдЭреЗ рдЕрднреА рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИред

npm ls react рдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджрд┐рдЦрд╛рдпрд╛:

тФЬтФАтФм @storybook/[email protected]
тФВ тФФтФАтФА [email protected]
тФФтФАтФА [email protected]

react рдФрд░ react-dom рдХреЛ 16.9.0 рдкрд┐рди рдХрд░рдиреЗ рд╕реЗ рддреНрд░реБрдЯрд┐ рджреВрд░ рд╣реЛ рдЧрдИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рд╕реЗ рдХреНрд╖рдгрд┐рдХ рдирд┐рд░реНрднрд░рддрд╛ рджреВрд░ рд╣реЛ рдЧрдИред рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм 16.10.0 рдореЗрдВ рдПрдХ рдкреНрд░рддрд┐рдЧрдорди рдерд╛ рдЬрдм рддрдХ рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рд╕рдорд╕реНрдпрд╛ 16.8.6 рдореЗрдВ рднреА рд╣реБрдИ рдереА (рдХреНрдпреЛрдВрдХрд┐ рдХреНрд╖рдгрд┐рдХ рдирд┐рд░реНрднрд░рддрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд┐рди рдХреА рдЧрдИ рдереА)ред

рдпрд╛рд░реНрди рдХреЗ resolutions рдлрд╝реАрд▓реНрдб рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд▓рд░реНрди рдореЛрдиреЛрд░реЗрдкреЛрд╕ рдореЗрдВ, рд▓реЗрдХрд┐рди рд░рд┐рдПрдХреНрдЯ рдХреА рджреВрд╕рд░реА рдкреНрд░рддрд┐ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рд╕реЗ рдЪрд╛рд▓ рдЪрд▓реАред рдореБрдЭреЗ рдЕрднреА рднреА рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдмрдВрдбрд▓ рдореЗрдВ рдХреИрд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реБрдЖ, рд▓реЗрдХрд┐рди рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдХрд╛рд░рдг рдмрдирд╛ред

рдореИрдВ рдЕрдм @storybook/addon-info рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЫреЛрдбрд╝рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдЕрдиреНрдп рдирд┐рд░реНрднрд░рддрд╛ рдкрд░ рднреА рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ 0.14 (рд╣рд╛рдВ) рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрд╕ рдХрд┐рд╕реА рдиреЗ рдЕрднреА рддрдХ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдкреИрджрд╛ рдХреА рд╣реИред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрд╕ рдкрд░ рд▓рдЧрднрдЧ рдЪрд╛рд░ рдШрдВрдЯреЗ рдмрд┐рддрд╛рдП рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП resolutions рдирд╣реАрдВ рдорд┐рд▓рд╛ рдФрд░ рдпрд╣ рдорд╛рдирдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдХрд┐ рд░рд┐рдПрдХреНрдЯ рдХреА рдХреЙрдкреА рднреА рдмрдВрдбрд▓ рдореЗрдВ рдорд┐рд▓ рдЧрдИ рд╣реИред рдореЗрд░реЗ рдЬреИрд╕рд╛ рдордд рдмрдиреЛред рдЕрдкрдиреА рдХреНрд╖рдгрд┐рдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдБ рдШрдЯрд╛рдПрдБред

рдРрд╕рд╛ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдореИрдВ рдПрдЪрдУрд╕реА рдХреЗ рдЕрдВрджрд░ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред

const HOC = Component => {
  return (props) => {
    const [val] = useState();
    return <div>{val}</div>
  }
}

рдореИрдВ рднреА рдЗрд╕реА рдореБрджреНрджреЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

.

рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдореЗрд░рд╛ рдорд╛рд░реНрдЧрджрд░реНрд╢рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

@ рдиреАрд░рдЬ-рд╕реНрд╡рд░реНрдгрдХрд╛рд░ рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХрдо рд╕реЗ рдХрдо рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХрдо рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдЬреЛ рдЕрднреА рднреА рддреНрд░реБрдЯрд┐ рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИред

рдпрд╣ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рджреЛ рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдЙрдмрд╛рд▓рддрд╛ рд╣реИ:

  • рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рдШрдЯрдХ рдкрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд░реЗрдВрдбрд░ рдкреНрд░реЛрдк рд╣реИ (рдпрд╛рдиреА "рдШрдЯрдХ" рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдШрдЯрдХ рдирд╣реАрдВ)
  • рдЖрдкрдиреЗ рдХрд┐рд╕реА рддрд░рд╣ рдЕрдкрдиреА рдХреНрд╖рдгрд┐рдХ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░рд┐рдПрдХреНрдЯ рдХреЗ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рдмрдВрдбрд▓ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рд╡реЗ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рдкреИрд░ рдХреА рдЙрдВрдЧрд▓рд┐рдпреЛрдВ рдкрд░ рдХрджрдо рд░рдЦрддреЗ рд╣реИрдВ

рдЕрдлрд╕реЛрд╕ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕реНрдЯреИрдХ рдХреЗ рдирд┐рд╢рд╛рди рднреНрд░рд╛рдордХ рд╣реЛрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдЖрдо рддреМрд░ рдкрд░ рдЖрдкрдХреЛ рд╕рд╣реА рд╡рд┐рдЪрд╛рд░ рджреЗрддреЗ рд╣реИрдВред

@ рдиреАрд░рдЬ-рд╕реНрд╡рд░реНрдгрдХрд╛рд░ рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХрдо рд╕реЗ рдХрдо рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХрдо рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдЬреЛ рдЕрднреА рднреА рддреНрд░реБрдЯрд┐ рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИред

рдпрд╣ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рджреЛ рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдЙрдмрд╛рд▓рддрд╛ рд╣реИ:

  • рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рдШрдЯрдХ рдкрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд░реЗрдВрдбрд░ рдкреНрд░реЛрдк рд╣реИ (рдпрд╛рдиреА "рдШрдЯрдХ" рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдШрдЯрдХ рдирд╣реАрдВ)
  • рдЖрдкрдиреЗ рдХрд┐рд╕реА рддрд░рд╣ рдЕрдкрдиреА рдХреНрд╖рдгрд┐рдХ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░рд┐рдПрдХреНрдЯ рдХреЗ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рдмрдВрдбрд▓ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рд╡реЗ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рдкреИрд░ рдХреА рдЙрдВрдЧрд▓рд┐рдпреЛрдВ рдкрд░ рдХрджрдо рд░рдЦрддреЗ рд╣реИрдВ

рдЕрдлрд╕реЛрд╕ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕реНрдЯреИрдХ рдХреЗ рдирд┐рд╢рд╛рди рднреНрд░рд╛рдордХ рд╣реЛрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдЖрдо рддреМрд░ рдкрд░ рдЖрдкрдХреЛ рд╕рд╣реА рд╡рд┐рдЪрд╛рд░ рджреЗрддреЗ рд╣реИрдВред

рд╕реВрдЪрдХ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдХреНрдпрд╛ рдЖрдк рдореБрдЭреЗ рдорд╛рд░реНрдЧрджрд░реНрд╢рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдмреЗрд╣рддрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

@ рдиреАрд░рдЬ-рд╕реНрд╡рд░реНрдгрдХрд╛рд░ рдХреЛрдб рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдЬрдм рддрдХ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдиреНрдпреВрдирддрдо рдЙрджрд╛рд╣рд░рдг рди рд╣реЛ рдЬреЛ рдЕрднреА рднреА рдПрдХ рд╣реА рддреНрд░реБрдЯрд┐ рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рд╕рд╣рдХрд░реНрдореА рдпрд╛ рд╕рд╣рдХрд░реНрдореА рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рдбреАрдмрдЧ рдХрд░рдиреЗ рдореЗрдВ рдЖрдкрдХреА рд╕рд╣рд╛рдпрддрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ, рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдкрдХреЛ рдХреЛрдИ рд╕реНрдерд╛рдиреАрдп рдмреИрдардХ, рдЕрдзреНрдпрдпрди рд╕рдореВрд╣ рдпрд╛ рдХреЛрдИ рдХрдВрдкрдиреА рдорд┐рд▓ рд╕рдХрддреА рд╣реИ рдЬреЛ рдХрд╛рд░реНрдпрд╛рд▓рдп рдХрд╛ рд╕рдордп рдЦреЛрд▓рддреА рд╣реИ рдФрд░ рдЙрдирд╕реЗ рдорджрдж рдорд╛рдВрдЧрддреА рд╣реИред рдпрджрд┐ рд╕рдм рдХреБрдЫ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдХреЛ рдХрд┐рд░рд╛рдП рдкрд░ рд▓реЗрдВред

рдореЗрд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдФрд░ рдХреНрд░рд┐рдПрдЯ-рд░рд┐рдПрдХреНрд╢рди-рдРрдк рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╣реИрдВ рдФрд░ рдореИрдВ npm рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ

рдХреНрдпрд╛ рдЖрдкрдиреЗ рдпрд╣ рднрд╛рдЧ рдкрдврд╝рд╛?

https://reactjs.org/warnings/invalid-hook-call-warning.html#duplicate -react

рдпрд╣ рд╕реАрдзреЗ link рдХрд╛рд░реНрдпрдкреНрд░рд╡рд╛рд╣ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ:

Screen Shot 2019-04-04 at 09 28 47

рдпрд╣ рдХрд╛рдо рдПрдХ рдЖрдХрд░реНрд╖рдг рдХреА рддрд░рд╣ рд╣реИ!

рдореЗрд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдФрд░ рдХреНрд░рд┐рдПрдЯ-рд░рд┐рдПрдХреНрд╢рди-рдРрдк рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╣реИрдВ рдФрд░ рдореИрдВ npm рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ

рдХреНрдпрд╛ рдЖрдкрдиреЗ рдпрд╣ рднрд╛рдЧ рдкрдврд╝рд╛?

https://reactjs.org/warnings/invalid-hook-call-warning.html#duplicate -react

рдпрд╣ рд╕реАрдзреЗ link рдХрд╛рд░реНрдпрдкреНрд░рд╡рд╛рд╣ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ:

Screen Shot 2019-04-04 at 09 28 47

рдпрд╣ рдХрд╛рдо рдПрдХ рдЖрдХрд░реНрд╖рдг рдХреА рддрд░рд╣ рд╣реИ!

рдореИрдВрдиреЗ рдХрд▓ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛, рдЗрд╕рдиреЗ рдореБрдЭреЗ рдЖрдзреЗ рдорд╣реАрдиреЗ рддрдХ рдкрд░реЗрд╢рд╛рди рдХрд┐рдпрд╛ред рдХрд▓ рдореИрдВрдиреЗ рдХреЛрдб рдХреЛ рдмрд╣реБрдд рдХрдо рдХрд░ рджрд┐рдпрд╛ (рдмрд╕ рдЬреЛрдбрд╝реЗрдВ

рдореИрдВ рдЗрд╕реЗ рдкрд░рд┐рд╡рд░реНрддрди рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд░рддрд╛ рд╣реВрдВ

                <Route key={index} render={route.component} path={route.path} />

рдкреНрд░рддрд┐

                <Route key={index} component={route.component} path={route.path} />

рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХреНрдпреЛрдВ :(

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдХреНрдпреЛрдВред

рдпрджрд┐ рдЖрдк рдпрд╣рд╛рдВ рдЗрд╕рд▓рд┐рдП рдЖ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рд╕рд╛рдордЧреНрд░реА UI рд╕реЗ HOC + makeStyles рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ,
рдпрд╣рд╛рдБ рдЬрд╡рд╛рдм рд╣реИ: https://stackoverflow.com/questions/56329992/invalid-hook-call-hooks-can-only-be-called-inside-of-the-body-of-a-function-com

рдореИрдВ рдЗрд╕реЗ рдкрд░рд┐рд╡рд░реНрддрди рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд░рддрд╛ рд╣реВрдВ

                <Route key={index} render={route.component} path={route.path} />

рдкреНрд░рддрд┐

                <Route key={index} component={route.component} path={route.path} />

рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХреНрдпреЛрдВ :(

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдХреНрдпреЛрдВред

"рдШрдЯрдХ" рдкреНрд░реЛрдк рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдШрдЯрдХ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ, "рд░реЗрдВрдбрд░" рдкреНрд░реЛрдк рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдлрд╝рдВрдХреНрд╢рди рдШрдЯрдХ рдШрдЯрдХ рд╣реЛрддреЗ рд╣реИрдВ, рдпрджрд┐ рд╡реЗ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЙрдиреНрд╣реЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдо рддреМрд░ рдкрд░ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИред

рдореИрдВ рдЗрд╕реЗ рдкрд░рд┐рд╡рд░реНрддрди рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд░рддрд╛ рд╣реВрдВ

                <Route key={index} render={route.component} path={route.path} />

рдкреНрд░рддрд┐

                <Route key={index} component={route.component} path={route.path} />

рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХреНрдпреЛрдВ :(

рдзрдиреНрдпрд╡рд╛рдж, рдкреНрд░рд┐рдп, рдЗрд╕рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛, рдлрд┐рд░ рднреА, рдореИрдВ рдЙрд▓рдЭрди рдореЗрдВ рд╣реВрдБ, рдХреНрдпреЛрдВ?

@jaisonjjames рдореЗрд░рд╛ рдЬрд╡рд╛рдм рджреЗрдЦреЗрдВред рдпрджрд┐ рдЖрдкрдХреЛ рдЕрдВрддрд░ рд╕рдордЭрдиреЗ рдореЗрдВ рдкрд░реЗрд╢рд╛рдиреА рд╣реЛ рддреЛ StackOverflow рдкрд░ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рджрд┐рдП рдЧрдП рд╣реИрдВ: https://stackoverflow.com/questions/48150567/react-router-difference-between-component-and-render

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореЗрд░реЗ рдкрд╛рд╕ рдШрдЯрдХ рдХреЗ рдмрд╛рд╣рд░ let match = useRouteMatch("/user/:id"); , рдЬреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд░рд╛рдЙрдЯрд░ рд╕реЗ рдПрдХ рд╣реБрдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рддреНрд░реБрдЯрд┐ рд╕рд╣реА рдереАред

рд╕реЗ

рдкреНрд░рддрд┐

рд╕реЗ

<Route path="/component" component={myComponent} />

рдкреНрд░рддрд┐

<Route path="/component"><myComponent /></Route>

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореИрдВ window рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рдерд╛ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдерд╛ред рдореИрдВрдиреЗ рд╡реЗрдмрдкреИрдХ рд╕реЗ externals рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд┐рд╕рд╕реЗ рдореБрдЭреЗ рдЙрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ react рдФрд░ react-dom рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реА рдФрд░ рддреНрд░реБрдЯрд┐ рджреВрд░ рд╣реЛ рдЧрдИред

рдЗрд╕рд▓рд┐рдП рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рдЗрд╕рд▓рд┐рдП рдорд┐рд▓ рд░рд╣реА рдереА рдХреНрдпреЛрдВрдХрд┐ You might have more than one copy of React in the same app ред

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореИрдВ window рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рдерд╛ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдерд╛ред рдореИрдВрдиреЗ рд╡реЗрдмрдкреИрдХ рд╕реЗ externals рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд┐рд╕рд╕реЗ рдореБрдЭреЗ рдЙрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ react рдФрд░ react-dom рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реА рдФрд░ рддреНрд░реБрдЯрд┐ рджреВрд░ рд╣реЛ рдЧрдИред

рдЗрд╕рд▓рд┐рдП рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рдЗрд╕рд▓рд┐рдП рдорд┐рд▓ рд░рд╣реА рдереА рдХреНрдпреЛрдВрдХрд┐ You might have more than one copy of React in the same app ред

@AbreezaSaleem рдЖрдкрдиреЗ рдЗрд╕реЗ рдХреИрд╕реЗ рдкреВрд░рд╛ рдХрд┐рдпрд╛? рдореБрдЭреЗ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬрд┐рд╕рдореЗрдВ react рдмрд╛рд╣рд░реА рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИ, рдХрд┐рд╕реА рднреА рддрд░рд╣ рдПрдХ рдЕрд▓рдЧ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣рд╛ рд╣реИ ... рдореИрдВрдиреЗ externals: [ 'react' ] , externals: { react: 'react' } рдФрд░ externals: { react: 'React' } , рдкрд░рд┐рдгрд╛рдо рд╣рдореЗрд╢рд╛ рдПрдХ рдЬреИрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ...

рдореИрдВрдиреЗ рдЗрд╕реЗ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╣рдж рддрдХ рдиреНрдпреВрдирддрдо рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдпрд╛ рд╣реИред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрди-рд╡реЗрдмрдкреИрдХ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреНрд░реЙрдкрдЬрд╝реЛрди рдХреЗ рд╕рд╛рде рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирдЬреЗрдПрд╕ рдкрд░ рд╕рдорд╕реНрдпрд╛ рд╣реЛрддреА рд╣реИ

https://github.com/JuanIrache/dropzone-test

рдПрдХ рд╣реА/рдПрдХрд▓ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕рдорд╛рдзрд╛рди рд╣реИред рдпрд╣ рдРрдк рдХреЗ рдЕрдВрджрд░ рдПрдХ рд╕рдВрдХрд▓реНрдк рдЬреЛрдбрд╝рдирд╛ рдерд╛ рдЬреЛ 'рдПрдирдкреАрдПрдо рдореЙрдбреНрдпреВрд▓ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП' рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред

webpack.config.js рдХреЗ рдЕрдВрджрд░, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдирд╛рдо рдЬреЛрдбрд╝реЗрдВ - рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЙрд╕ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:

module.exports = {
resolve: {
    alias: {
      react: path.resolve('./node_modules/react')
    }
  },
 // other webpack settings
}

рд▓рд░реНрди рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЖрдЬ (рд▓рд░реНрдиреЗрдб?) рд╕реАрдЦрд╛ рд╣реИред

lerna рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛, рдпрджрд┐ рдЖрдк рдПрдХ рдШрдЯрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЕрдкрдиреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рдирд┐рд░реНрднрд░рддрд╛ рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╢рд╛рдорд┐рд▓ рди рдХрд░реЗрдВ, рдЗрд╕реЗ рдЕрдкрдиреЗ рд╕рд╣рдХрд░реНрдореА рдирд┐рд░реНрднрд░рддрд╛ рдореЗрдВ рдФрд░ @ рдкреНрд░рдХрд╛рд░/рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЕрдкрдиреА рдирд┐рд░реНрднрд░рддрд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВред

рд▓рд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП, рдПрдХ рдкреИрдХреЗрдЬ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддреЗ рд╕рдордп рдЖрдкрдХреЛ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдХреЛрдб рджреВрд╕рд░реЗ рдкреИрдХреЗрдЬ рдореЗрдВ рдШрдЯрдХреЛрдВ рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрддрд╛ рд╣реИред

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдордиреЗ рдЬрд┐рд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдЕрдиреБрднрд╡ рдХрд┐рдпрд╛, рд╡рд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдХрд╛рд░рдг рдХрд▓реНрдкрдирд╛ рдореЗрдВ рдЖрдпрд╛рдд рдХреА рдЬрд╛ рд░рд╣реА рдереА, рдФрд░ рдШрдЯрдХ рдЯреНрд░реА рдореЗрдВ рдПрдХ рдШрдЯрдХ рдореЗрдВ рдЖрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рдерд╛ рдЬреЛ рд╕рд╛рдордЧреНрд░реА UI рдХреЗ withStyles рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛, рдЬрд┐рд╕реЗ рд╕рд╛рдордЧреНрд░реА UI рдореЗрдВ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ ReactCurrentDispatcher.current рдЪрд░ рдореЗрдВ рд░рд╛рдЬреНрдп рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддреА рд╣реИ, рдФрд░ рдпрд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕реЗрдЯ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреВрд╕рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИ - рдЬрдм рдпрд╣ рдЦрд╛рд▓реА рд╣реЛрддреА рд╣реИ, рддреЛ рдпрд╣ Invalid hook call ... рдлреЗрдВрдХрддрд╛ рд╣реИ

рд╣рдо рдмрд┐рд▓реНрдб рд╕рдордп рдкрд░ рдХреНрд░рд┐рдПрдЯ рд░рд┐рдПрдХреНрдЯ рдРрдк рдХреЗ рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА

  webpack: {
    alias: {
      react: path.resolve(__dirname, './node_modules/react'),
    },
  },

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рд╡реЗрдмрдкреИрдХ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдирд┐рд░реНрдорд╛рдг рд╕рдордп рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддреЗ рд╕рдордп, рдХреЛрдб рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реНрд░реЛрдд рд╕реЗ рддреНрд╡рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░рд╛ рд╕рдорд╛рдзрд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ craco.config.js рдореЗрдВ рдХреНрд░реЗрдХреЛрдЕрд▓рд┐рдпрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдерд╛ред рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкрде:

  plugins: [
    {
      plugin: CracoAlias,
      options: {
        source: 'options',
        baseUrl: './',
        aliases: {
          // We need to alias react to the one installed in the desktop/node_modules
          // in order to solve the error "hooks can only be called inside the body of a function component"
          // which is encountered during desktop jest unit tests,
          // described at https://github.com/facebook/react/issues/13991
          // This is caused by two different instances of react being loaded:
          // * the first at packages/desktop/node_modules (for HostSignUpDownloadComponent.spec.js)
          // * the second at packages/components/node_modules (for packages/components/Modal)
          react: './node_modules/react',
        },
      },
    },
  ],
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

trusktr picture trusktr  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jmullo picture jmullo  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

framerate picture framerate  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

zpao picture zpao  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

UnbearableBear picture UnbearableBear  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ