web-dev-qa-db-fra.com

Soit envelopper le composant racine dans un <Provider>, soit passer explicitement "store" comme accessoire à "Connect (CharacterList)

J'essaie de tester mon React "supersquadapp" et j'obtiens l'erreur suivante.

Erreur non interceptée: impossible de trouver "magasin" dans le contexte ou les accessoires de "Connect (CharacterList)". Soit envelopper le composant racine dans un, soit passer explicitement "store" comme accessoire à "Connect (CharacterList)".

characterlist.js

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

class CharacterList extends Component {
    render() {
        console.log('this.props', this.props);
        return (
            <div>
                <h4>characters</h4>
            </div>
        )
    }

}
function mapStateToProps(state) {
    return {
        characters: state.characters
    }
}

export default connect(mapStateToProps, null)(CharacterList);

app.js

import React, {Component} from 'react';
import CharacterList from './CharacterList';

class App extends Component {
    render() {
        return (
            <div>
                <h2>SUPER SQUAD</h2>
                <CharacterList />
            </div>
        )
    }
} 
export default App;

index.js

import React from 'react';
import ReactDOM from 'react-dom';
import App from './Components/App';

import { createStore } from 'redux';
import { Provider } from 'react-redux';

import rootReducers from './reducers';
import { addCharacterById } from './actions';


const store = createStore(rootReducers);
console.log(store.getState());
store.subscribe(() => console.log('store',store.getState()))
store.dispatch(addCharacterById(3));

ReactDOM.render(
    <Provider>
        <App />
     </Provider>
    ,document.getElementById('root')
)

character.js (dans le dossier des réducteurs)

import characters_json from '../Data/characters.json';
import { ADD_CHARACTER } from '../actions';

function characters(state = characters_json, action) {
    switch(action.type) {
        case ADD_CHARACTER:
        let characters = state.filter(item => item.id !== action.id);
        return characters;
        default:
            return state;
    }
}
export default characters;

heroes.js (dossier réducteurs)

import { ADD_CHARACTER } from '../actions';
import {createCharacter} from './helper';

function heroes(state = [], action) {
    switch(action.type) {
        case ADD_CHARACTER:
        let heroes = [...state, createCharacter(action.id)];
        return heroes;
        default:
        return state;
    }
}
export default heroes;

helper.js (dossier réducteurs)

import characters_json from '../Data/characters.json';

export function createCharacter(id) {
    let character = characters_json.find(c => c.id === id);
    return character;
}

index.js (dossier réducteurs)

import { combineReducers } from 'redux';
import characters from './characters_reducer';
import heroes from './heroes_reducer';


const rootReducer = combineReducers({
    characters,
    heroes
})
export default rootReducer;

index.js (dossier d'action)

export const ADD_CHARACTER = 'ADD_CHARACTER';

export function addCharacterById(id) {
    const action = {
        type:ADD_CHARACTER,
        id
    }
    return action;
}

L'erreur ci-dessus s'est produite dans le composant:

dans Connect (CharacterList) (sur App.js: 9)

en div (sur App.js: 7)

dans l'application (à index.js: 19)

dans le fournisseur (à index.js: 18)

aidez-moi, s'il vous plaît...?

9
kasim521

Vous devez transmettre l'instance de magasin au fournisseur ...

ReactDOM.render(
    <Provider store={store}>
        <App />
     </Provider>
    , document.getElementById('root')
)
7
alechill

Si vous exécutez un test et que vous avez quelque chose comme la réponse d'alechill, vous en aurez besoin pour changer dans le test, par exemple:

let mockedStore = configureStore([])({});
test('some test', () => {
  const wrapper = mount(<SomeComponent foo="bar" />, {
    context: { store: mockedStore },
    childContextTypes: { store: PropTypes.object.isRequired }
  });
  expect(.... your tests here);
});
8
rrd