ΠΠ°ΠΊ Ρ ΠΌΠΎΠ³Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ±ΠΎΡΠ½ΠΈΠΊ ΡΠ°ΡΡΠΊΠ°Π·ΠΎΠ² Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΠΌΠΈ, Π² ΠΊΠΎΡΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠ΅Π°Π³ΠΈΡΡΡΡΠΈΠΉ ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΎΡ
import React from 'react'
import PropTypes from 'prop-types'
import { Link } from 'react-router-dom'
import Brand from './components'
const Logo = ({children}) => {
return (
<Link to='/'>
<Brand>
{children}
</Brand>
</Link>
)
}
Logo.propTypes = {
children: PropTypes.string.isRequired
}
export default Logo
ΠΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π·Π°ΠΊΠ»ΡΡΠΈΡΡ ΡΠ²ΠΎΡ ΠΈΡΡΠΎΡΠΈΡ Π² MemoryRouter
ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΠ½ΠΊΡΠΈΡ addDecorator
. ΠΠΎΡ ΠΎΡΡΡΠ²ΠΎΠΊ:
storiesOf('Logo', module)
.addDecorator(story => (
<MemoryRouter initialEntries={['/']}>{story()}</MemoryRouter>
))
.add('normal', () => <Logo />)
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ ΠΏΠΎΠ»Π½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π΄Π΅ΡΡ: https://blog.hichroma.com/graphql-react-tutorial-part-5-6-ac36b6962a8a
Π‘ΠΌ. ΠΡΠΎΡ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ Π·Π΄Π΅ΡΡ, Π΅ΡΠ»ΠΈ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅, ΡΡΠΎΠ±Ρ ΡΡΡΠ»ΠΊΠΈ Π΄Π»Ρ Π°ΠΊΡΠΈΠ²Π°ΡΠΈΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ Storybook: https://github.com/storybooks/react-storybook/issues/485#issuecomment -294105214
ΠΡΠΊΠ°Π» ΡΡΡ ΠΎΡΠΈΠ±ΠΊΡ ΠΈ Ρ ΡΡΡΠ΄ΠΎΠΌ Π½Π°ΡΠ΅Π» ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΎΠ½Π° Π±ΡΠ»Π° ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½Π° Π² ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΈ. ΠΡΡΠ°Π²ΡΡΠ΅ ΡΠ΅ΠΊΡΡ ΡΠ΅ΠΉΡΠ°Ρ, ΡΡΠΎΠ±Ρ Π»ΡΠ΄ΡΠΌ Π±ΡΠ»ΠΎ Π»Π΅Π³ΡΠ΅ Π΅Π³ΠΎ Π½Π°ΠΉΡΠΈ Π² Π±ΡΠ΄ΡΡΠ΅ΠΌ:
ΠΠ΅ ΡΠ΄Π°Π΅ΡΡΡ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ "ΠΈΡΡΠΎΡΠΈΡ" ΡΠ²ΠΎΠΉΡΡΠ²Π° undefined
TypeError: Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ ΠΈΡΡΠΎΡΠΈΡ ΡΠ²ΠΎΠΉΡΡΠ²Π° undefined
Π² Link.render (http: // localhost: 9001 / static / preview.bundle.js: 52878: 35)
ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ http: // localhost : 9001 / static / preview.bundle.js: 43410: 21
Π² measureLifeCyclePerf (http: // localhost: 9001 / static / preview.bundle.js: 42690: 12)
Π² ReactCompositeComponentWrapper._renderValidatedComponentWithoutOwnerOrContext (http: // localhost: 9001 / static / preview.bundle.js: 43409: 25)
Π² ReactCompositeComponentWrapper._renderValidatedComponent (http: // localhost: 9001 / static / preview.bundle.js: 43436: 32)
Π² ReactCompositeComponentWrapper.performInitialMount (http: // localhost: 9001 / static / preview.bundle.js: 42976: 30)
Π² ReactCompositeComponentWrapper.mountComponent (http: // localhost: 9001 / static / preview.bundle.js: 42872: 21)
Π² Object.mountComponent (http: // localhost: 9001 / static / preview.bundle.js: 4438: 35)
Π² ReactDOMComponent.mountChildren (http: // localhost: 9001 / static / preview.bundle.js: 42241: 44)
Π² ReactDOMComponent._createInitialChildren (http: // localhost: 9001 / static / preview.bundle.js: 40403: 32)
Π― ΠΏΠΎΠ»ΡΡΠ°Ρ ΡΠΊΠ°Π·Π°Π½Π½ΡΡ Π½ΠΈΠΆΠ΅ ΠΎΡΠΈΠ±ΠΊΡ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ MemoryRouter
, ΠΈ ΠΊΠ°ΠΆΠ΅ΡΡΡ, ΡΡΠΎ MemoryRouter
Π²ΡΡ
ΠΎΠ΄ΠΈΡ ΠΊΠ°ΠΊ undefined
.
Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: undefined. You likely forgot to export your component from the file it's defined in.
Invariant Violation: Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: undefined. You likely forgot to export your component from the file it's defined in.
at invariant (http://localhost:6006/static/preview.bundle.js:2056:15)
at createFiberFromElementType (http://localhost:6006/static/preview.bundle.js:27773:5)
at createFiberFromElement (http://localhost:6006/static/preview.bundle.js:27718:15)
at reconcileSingleElement (http://localhost:6006/static/preview.bundle.js:28966:19)
at reconcileChildFibers (http://localhost:6006/static/preview.bundle.js:29065:35)
at reconcileChildrenAtPriority (http://localhost:6006/static/preview.bundle.js:29715:30)
at reconcileChildren (http://localhost:6006/static/preview.bundle.js:29706:5)
at finishClassComponent (http://localhost:6006/static/preview.bundle.js:29842:5)
at updateClassComponent (http://localhost:6006/static/preview.bundle.js:29814:12)
at beginWork (http://localhost:6006/static/preview.bundle.js:30193:16)
ΠΡΡΡ ΠΈΠ΄Π΅ΠΈ, ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡΡ?
ΠΡΠΈΠ²Π΅Ρ @oyeanuj ,
ΠΡΡΡ Π½ΠΎΠ²ΠΎΡΡΠΈ ΠΎΠ± ΡΡΠΎΠΌ? Π£ ΠΌΠ΅Π½Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡ ΠΏΠΎΡ
ΠΎΠΆΠΈΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Route
.
@aperkaz Π― Π²ΠΊΠ»ΡΡΠΈΠ» ΡΡΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Π² Storybook :( Π― ΡΠΎΠΆΠ΅ Π±ΡΠ΄Ρ ΠΆΠ΄Π°ΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΡ ..
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, ΠΊΠ°ΠΊΡΡ Π²Π΅ΡΡΠΈΡ ΡΠ΅Π°ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΎΡΠ° Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅.
Π Π΅ΡΠ΅Π½ΠΈΠ΅ ΠΎΡ @shilman Π²ΡΡΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ
ΠΠ»Ρ ΡΠ΅Π°ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΎΡΠ° 3:
// ...
import { Router, Route } from 'react-router';
import createMemoryHistory from 'react-router/lib/createMemoryHistory';
storiesOf('Foo', module)
.addDecorator(story => (
<Router history={createMemoryHistory('/')}>
<Route path="/" component={() => story()} />
</Router>
))
.add('Default', () => <Foo />);
ΠΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΉ ΠΎΡΠ²Π΅Ρ ΠΎΡΠ»ΠΈΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, Π½ΠΎ Ρ ΠΏΠΎΠ»ΡΡΠ°Ρ
Uncaught ReferenceError: ___loader is not defined
ΠΡΠ±Π°Ρ ΠΏΠΎΠΌΠΎΡΡ Ρ ΡΡΠΎΠΉ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ
ΠΠ»Ρ ΡΠ΅Ρ , ΠΊΡΠΎ ΠΏΡΠΈΠ·Π΅ΠΌΠ»ΠΈΡΡΡ Π·Π΄Π΅ΡΡ Π² Π±ΡΠ΄ΡΡΠ΅ΠΌ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΠΎΠ³ΡΠ³Π»ΠΈΠ» ΠΈ Π²ΡΡΠ²Π°Π» Π²ΠΎΠ»ΠΎΡΡ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΠ΅ ΠΌΠ½Π΅, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡΡ Π²Π°ΠΌ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ.
Π ΠΏΡΠΎΠ΅ΠΊΡΠ΅, Π½Π°Π΄ ΠΊΠΎΡΠΎΡΡΠΌ Ρ ΡΠ°Π±ΠΎΡΠ°Π», Π±ΡΠ»ΠΎ Π½Π΅ΡΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅ Π²Π΅ΡΡΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρ react-router
(ΠΊΠΎΡΠΎΡΠΎΠ΅ Π±ΡΠ»ΠΎ Π² "^ 4.1.1" Π² package.json) ΠΈ react-router-dom
(ΠΊΠΎΡΠΎΡΠΎΠ΅ Π±ΡΠ»ΠΎ Π² "next").
Π ΠΌΠΎΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠΎ Π²ΡΠ·Π²Π°Π»ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΈΠ·-Π·Π° ΡΠΎΠ³ΠΎ, ΡΡΠΎ React ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ» ΡΠΏΠΎΡΠΎΠ± ΡΠ°Π±ΠΎΡΡ this.context
, Π° react-router-dom
ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Π» Π΅Π³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΡ. ΠΡΠΎ Π·Π°ΠΊΠΎΠ½ΡΠΈΠ»ΠΎΡΡ ΡΠ΅ΠΌ, ΡΡΠΎ ΠΌΠΎΠΉ <Link />
ΠΏΡΡΠ°Π»ΡΡ ΠΈΠ·Π²Π»Π΅ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π΅ΡΠ΅ Π½Π΅ Π±ΡΠ»ΠΎ, ΠΈ Π²ΡΠ΄Π°Π²Π°Π» ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π±Π΅ΡΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ "ΠΡ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π²Π½Π΅
Π― ΠΈΡΠΏΡΠ°Π²ΠΈΠ» ΡΡΠΎ, Π·Π°ΠΌΠ΅Π½ΠΈΠ² "react-router-dom": "next"
Π½Π° "react-router-dom": "^4.1.1"
.
ΠΠ»Ρ ΠΊΠΎΠ³ΠΎ-ΡΠΎ Π΅ΡΠ΅ ΠΌΠ½Π΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠΎΠΌΠΎΠ³ ΡΡΠΎΡ ΠΏΠ°ΠΊΠ΅Ρ: https://github.com/gvaldambrini/storybook-router/
ΠΠΎΠ»ΡΡΠΎΠ΅ ΡΠΏΠ°ΡΠΈΠ±ΠΎ, ΠΎΡΠ²Π΅ΡΡ ΠΏΠΎΠΌΠΎΠ³Π»ΠΈ
ΠΠ»Ρ ΡΠ΅Ρ , ΠΊΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΊΡΡΡΠΊΠΈ:
`` ''
ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ {createMemoryHistory} ΠΈΠ· "ΠΈΡΡΠΎΡΠΈΠΈ"
import {Router, Route} ΠΈΠ· 'response-router-dom'
const history = createMemoryHistory ({initialEntries: ['/']})
addDecorator (ΠΈΡΡΠΎΡΠΈΡ =>
addDecorator (ΠΈΡΡΠΎΡΠΈΡ => (
))
``
Π‘Π°ΠΌΡΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ
ΠΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π·Π°ΠΊΠ»ΡΡΠΈΡΡ ΡΠ²ΠΎΡ ΠΈΡΡΠΎΡΠΈΡ Π²
MemoryRouter
ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΠ½ΠΊΡΠΈΡaddDecorator
. ΠΠΎΡ ΠΎΡΡΡΠ²ΠΎΠΊ:ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ ΠΏΠΎΠ»Π½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π΄Π΅ΡΡ: https://blog.hichroma.com/graphql-react-tutorial-part-5-6-ac36b6962a8a