2
votes

React / Redux export default connect () ne semble pas être connecté au fournisseur

[Résolu] Vérifiez mes réponses

J'apprends MERN Stack via une playlist YouTube https://www.youtube.com/watch?v=TO6akRGXhx8 . Je suis coincé quand j'ai atteint le 28:04 où il a oublié de connecter son composant avec «react-redux». J'ai suivi comment il le résout mais bon, pour une raison quelconque, la mienne ne semble pas être liée. Aucun accessoire n'a été transmis à mon composant ItemModal. J'ai donc passé 3 heures à déboguer et à conclure enfin que j'ai trouvé bizarre que ce n'est que lorsque le js est nommé ShippingList que connect () fonctionne ... Quand j'ai renommé ShippingList en un autre nom et mis à jour les références, cela ne fonctionne plus. .. Veuillez vous reporter ci-dessous pour une partie de l'extrait de code

Je ne pense pas avoir besoin d'identifier un composant dans le magasin lors de sa création .. je suis donc stupéfait maintenant ..

Je me demandais si vous pouvez le reproduire, veuillez trouver mon dépôt https://github.com/AmeDin/mern

ShoppingList.js

const mapStateToProps = (state) => ({
    item: state.item
})


const mapDispatchToProps = (dispatch) => {
  console.log(dispatch)
}

export default connect(mapStateToProps, mapDispatchToProps)(ShoppingList);

ShoppingListOne.js

const mapStateToProps = (state) => ({
    item: state.item
})

const mapDispatchToProps = (dispatch) => {
  console.log(dispatch)

}

export default connect(mapStateToProps, mapDispatchToProps)(ShoppingListOne);

index.js

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import { createStore, applyMiddleware, compose } from 'redux'
import rootReducer from './reducers/index'
import thunk from 'redux-thunk'
import { Provider } from 'react-redux'
import * as serviceWorker from './serviceWorker';

const middleware = [thunk];

const store = createStore(rootReducer, 
    compose(
        applyMiddleware(thunk)
    )
);
ReactDOM.render(<Provider store={store}><App /></Provider>, 
document.getElementById('root'));

serviceWorker.unregister();

Capture d'écran de console.log: https://i.stack.imgur.com/FPBBs.png

Autres tests ShoppingListOne

import React, { Component } from 'react'
import { connect } from 'react-redux';

export class ShoppingListOne extends Component {


  render() {
    console.log(this.props)
    console.log(this.state)
    //const { items } = this.props.item;
    return (
      <div>

      </div>
    )
  }
}



const mapStateToProps = (state) => ({
    item: state.item
})

export default connect()(ShoppingListOne);

ShoppingList

import React, { Component } from 'react'
import { connect } from 'react-redux'

export class ShoppingList extends Component {


  render() {
    console.log(this.props)
    console.log(this.state)
    //const { items } = this.props.item;
    return (
      <div>

      </div>
    )
  }
}



const mapStateToProps = (state) => ({
    item: state.item
})

export default connect()(ShoppingList);

Aucune fonction ne semble être appelée pour ShoppingListOne. ShoppingList a une fonction appelée line26, 3e rangée de console.

https: / /i.stack.imgur.com/WxwRm.png


0 commentaires

3 Réponses :


2
votes

Vous devez transmettre mapStateToProps et mapDispatchToProps à connecter , afin qu'il puisse créer un wrapper ayant accès au magasin redux.

export default connect(mapStateToProps, mapDispatchToProps)(ShoppingList);
export default connect(mapStateToProps, mapDispatchToProps)(ShoppingListOne);


1 commentaires

Veuillez vous référer à mes mises à jour, j'y ai ajouté plus de description, codes et écrans



5
votes

Vous devez passer la fonction mapStateToProps comme premier argument à connect afin de rendre ces valeurs disponibles pour le composant connecté au magasin redux . Se connecter sans aucun argument ne fait rien d'autre que rendre dispatch disponible comme accessoire pour le composant connecté

import ShoppingListOne from './path/to/ShoppingListOne';

et

const mapStateToProps = (state) => ({
    item: state.item
})

export default connect(mapStateToProps)(ShoppingList);


4 commentaires

Bonjour, j'ai effectué ce test avant d'atteindre les lignes ci-dessous export default connect () (ShoppingListOne); export par défaut connect () (ShoppingList); pour d'autres tests de comportement. Ils résultent de la même manière .. je ne peux pas récupérer l'état du fournisseur de magasin dans ShoppingListOne, mais je peux le faire dans ShoppingList


@AmeM supprime le mot clé d'exportation avant la classe d'exportation ShoppingListOne étend le composant { et importe ce composant comme importation par défaut


Kathri, le problème concernait le composant d'importation. Je ne connais pas la différence entre la classe d'exportation et sans «exportation». Avec ou sans "export", cela fonctionnera si j'importe le composant sans les accolades "{}". Je lis pour en savoir plus et comprendre l'importation avec "{}" ou sans lui et aussi découvrir la différence entre "classe d'exportation" et "classe". Veuillez m'éclairer à ce sujet. stackoverflow.com/questions/36795819/...


@AmeM, le composant connecté est renvoyé en tant qu'export par défaut et vous devez donc l'importer en tant qu'importation par défaut sans utiliser {} . Pour en savoir plus, cliquez ici stackoverflow.com/questions/41337709/...



0
votes

J'ai découvert le problème ...

La déclaration d'importation semble jouer son rôle dans la connexion.

Erreur

import ShoppingList from './components/ShoppingList';
import ItemModal from './components/ItemModal';

Correct

import { ShoppingList } from './components/ShoppingList';
import { ItemModal } from './components/ItemModal';

Quelqu'un connaît les différences? Y a-t-il un message qui répond à ma question?


1 commentaires

import {ShoppingList} essaiera d'importer la propriété ShoppingList à partir de l'exportation par défaut tandis que import ShoppingList importe l'exportation par défaut. Si, dans ShoppingList.js , vous faites exporter la classe par défaut ShoppingList alors vous voudrez importer l'exportation par défaut, c'est-à-dire importer ShoppingList