Comment puis-je utiliser storybook avec des composants qui utilisent le routeur React
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
Vous devriez envelopper votre histoire dans un MemoryRouter
utilisant la fonction addDecorator
. Voici un extrait :
storiesOf('Logo', module)
.addDecorator(story => (
<MemoryRouter initialEntries={['/']}>{story()}</MemoryRouter>
))
.add('normal', () => <Logo />)
Vous pouvez lire un exemple complet ici : https://blog.hichroma.com/graphql-react-tutorial-part-5-6-ac36b6962a8a
Voir ce commentaire ici si vous voulez des liens pour déclencher des actions Storybook : https://github.com/storybooks/react-storybook/issues/485#issuecomment -294105214
Je cherchais cette erreur et j'ai eu du mal à trouver ce problème car il a été publié dans une image. Collez le texte maintenant pour le rendre plus facile à trouver à l'avenir :
Impossible de lire la propriété « historique » d'undefined
TypeError : impossible de lire la propriété « historique » d'undefined
sur Link.render (http://localhost:9001/static/preview.bundle.js:52878:35)
sur http://localhost :9001/static/preview.bundle.js:43410:21
sur 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)
sur ReactCompositeComponentWrapper.performInitialMount (http://localhost:9001/static/preview.bundle.js:42976:30)
sur ReactCompositeComponentWrapper.mountComponent (http://localhost:9001/static/preview.bundle.js:42872:21)
sur Object.mountComponent (http://localhost:9001/static/preview.bundle.js:4438:35)
sur ReactDOMComponent.mountChildren (http://localhost:9001/static/preview.bundle.js:42241:44)
sur ReactDOMComponent._createInitialChildren (http://localhost:9001/static/preview.bundle.js:40403:32)
J'obtiens l'erreur ci-dessous lors de l'utilisation de MemoryRouter
, et il semble que MemoryRouter
sorte en tant que 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)
Quelques idées sur ce qui pourrait se passer?
Bonjour @oyeanuj ,
Des nouvelles à ce propos? Je rencontre des problèmes assez similaires lors de l'utilisation de Route
.
@aperkaz Je n'ai pas encore réussi à faire fonctionner cela, donc je
Vous voudrez peut-être vérifier la version du routeur React que vous utilisez.
La solution de @shilman ci-dessus fonctionne avec le routeur
Pour le routeur de réaction 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 />);
La réponse acceptée fonctionne très bien, mais je reçois
Uncaught ReferenceError: ___loader is not defined
Toute aide avec cette erreur
Pour tous ceux qui atterrissent ici à l'avenir après avoir cherché sur Google et s'être arraché les cheveux, permettez-moi peut-être de vous faire gagner du temps.
Le projet sur lequel je travaillais avait une incompatibilité de version entre react-router
(qui était à "^4.1.1" dans package.json) et react-router-dom
, (qui était à "next").
Cela a causé un problème dans mon cas en raison du fait que React a modifié le fonctionnement de this.context
et que react-router-dom
emboîté le pas. Cela s'est terminé par mon <Link />
essayant d'extraire le contexte par une méthode qui n'existait pas encore, et jetant le exceptionnellement inutile "Vous ne devriez pas utiliser un en dehors d'un
Je l'ai corrigé en remplaçant "react-router-dom": "next"
par "react-router-dom": "^4.1.1"
.
Pour quiconque d'autre, ce qui m'a réellement aidé, c'est ce package : https://github.com/gvaldambrini/storybook-router/
Merci beaucoup, les réponses ont aidé
Pour toute personne utilisant des crochets :
```
importer { createMemoryHistory } à partir de « l'historique »
importer { Routeur, Route } depuis 'react-router-dom'
const history = createMemoryHistory({ initialEntries: ['/'] })
addDecorator(histoire =>
addDecorator(histoire => (
))
``
Commentaire le plus utile
Vous devriez envelopper votre histoire dans un
MemoryRouter
utilisant la fonctionaddDecorator
. Voici un extrait :Vous pouvez lire un exemple complet ici : https://blog.hichroma.com/graphql-react-tutorial-part-5-6-ac36b6962a8a