j'essayais de migrer react-redux
v5.X.X
vers v6.0.0
et il semble y avoir aucune documentation à ce sujet. J'utilise les versions suivantes: "react": "^16.4.2"
"redux": "^4.0.0"
"react-redux": "^6.0.0"
le journal officiel des changements dit.
Le passage de magasin en tant que support à un composant connecté n'est plus pris en charge. Au lieu de cela, vous pouvez passer un prop personnalisé context = {MyContext} à et. Vous pouvez également passer {context: MyContext} en tant qu'option pour vous connecter . le lien est ici
voici ma racine index.jsx
import React from 'react';
import ReactDOM from 'react-dom';
import { configureStore, history } from './Store';
import App from './App.hot';
import 'antd/dist/antd.min.css';
const reduxStore = configureStore();
ReactDOM.render(<App store={reduxStore} history={history} />, document.getElementById('root'));
voici mon app.jsx
(composant racine)
import React from 'react';
import PropTypes from 'prop-types';
import { Provider, connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import { ConnectedRouter } from 'connected-react-router';
import Layout from './Layout';
class App extends React.Component {
static propTypes = {
store: PropTypes.object.isRequired,
history: PropTypes.object.isRequired,
};
render() {
const { store, profile, history } = this.props;
return (
<main className="app-wrapper">
// what i understand from change log is this part
// i need to pass context instead of store as props.
<Provider store={store}>
<ConnectedRouter history={history}>
<Layout user={profile} />
</ConnectedRouter>
</Provider>
</main>
);
}
}
function mapStateToProps(store) {
return {
...
};
}
function mapDispatchToProps(dispatch) {
return bindActionCreators({
...
}, dispatch);
}
export default connect(mapStateToProps, mapDispatchToProps)(App);
selon le journal des modifications, j'ai créé context
et l'ai transmise au fournisseur
const storeContext = React.createContext(reduxStore);
voici ma fonction render
après ce changement
render() {
const { store, profile, history } = this.props;
return (
<main className="app-wrapper">
<Provider context={storeContext}>
<ConnectedRouter history={history}>
<Layout user={profile} />
</ConnectedRouter>
</Provider>
</main>
);
}
passer store
comme props
à provider
donne l'erreur suivante
Passer le magasin de redux dans les accessoires a été supprimé et ne fait rien. Pour utiliser un magasin Redux personnalisé pour des composants spécifiques, créez un contexte React personnalisé avec React.createContext (), puis transmettez l'objet de contexte au fournisseur de React-Redux et à des composants spécifiques tels que:. Vous pouvez également passer une option {context: MyContext} pour vous connecter
et passer comme context
donne l'erreur suivante
Impossible de trouver "magasin" dans le contexte de "Connect (App)". Enveloppez le composant racine dans un fichier ou passez un fournisseur de contexte React personnalisé et le consommateur de contexte React correspondant à Connect (App) dans les options de connexion.
je n'ai trouvé aucune documentation, mais attendez-vous à ce document d'historique de redux ici il indique tous les problèmes et solutions pour le problème dans react-redux et comment l'API de contexte l'a corrigé. mais je ne sais pas comment le mettre en œuvre dans un projet réel.
quelqu'un at-il affronté le même problème? ou pouvez-vous s'il vous plaît me dire comment exactement mettre en œuvre ce changement.
merci
J'ai pu résoudre le problème en écoutant ce que disait le message d'erreur.
il y avait deux problèmes avec mon code
store
comme accessoire à mon composant <App />
. C’est pourquoi le premier message d’avertissement/erreur est arrivé. Passer le magasin de redux dans les accessoires a été supprimé et ne fait rien. Pour utiliser un magasin Redux personnalisé pour des composants spécifiques, créez un contexte React personnalisé avec React.createContext () et transmettez l'objet de contexte au fournisseur de React-Redux et à des composants spécifiques tels que:. Vous pouvez également passer une option {context: MyContext} pour vous connecter
pour résoudre ce problème, ne passez simplement pas le redux store
entier comme accessoire à un composant
Provider
de react-redux
n'était pas le composant racine. le message d'erreur dit Impossible de trouver "magasin" dans le contexte de "Connect (App)". Soit enveloppé composant racine dans un fournisseur, ou transmettez un fournisseur de contexte React personnalisé à et le consommateur de contexte React correspondant à Connect (App) dans connecter les options
donc j'ai suivi la deuxième phrase dans la phrase
Enveloppez le composant racine dans un fournisseur ou transmettez un contexte de réaction personnalisé
donc j'ai enveloppé ma racine principale dans le fournisseur. et les choses ont commencé à bien fonctionner.
ReactDOM.render(
<Provider store={reduxStore}>
<App />
</Provider>, document.getElementById('root'),
);
J'ai eu le même problème et voici comment je l'ai résolu.
const MyContext = React.createContext();
class App extends Component {
render() {
return (
<Provider store = {store} context={MyContext}>
<BrowserRouter>
<div>
<Main context={MyContext}/>
</div>
</BrowserRouter>
</Provider>
);
}
}