Как мне настроить хранилище redux в моем приложении react?

#javascript #reactjs #redux #react-redux

#javascript #reactjs #redux #реагировать-redux

Вопрос:

Я не могу настроить хранилище redux в своем приложении. Я не получаю никаких ошибок в консоли. Когда я использую инструменты разработчика redux, он сообщает, что хранилище не обнаружено. Что я делаю не так? Нужно ли мне изменять мою функцию mapStateToProps? Похоже, что в руководствах, которым я следовал до сих пор, это не так. Мои файлы выглядят следующим образом:

index.js

 import React from "react";
import ReactDOM from "react-dom";
import { createStore } from 'redux';
import {Provider} from 'react-redux';
import { reducer } from './reducer';
import App from './App';



const store = createStore(reducer)

ReactDOM.render(
  <Provider store={store}>
    < App / >
  </Provider>,
  document.getElementById("root")
);

module.hot.accept(reducer);

export default store
  

App.js

 import React from 'react';
import { createStore } from 'redux';
import { connect, Provider } from 'react-redux';
import Map from './map/Map';

// const initialState = {
//   district: ''
// };

const action = {
  type: 'CHANGE_DISTRICT',
  district: 'Congressional District 17'
}

// const reducer = (state = initialState, action) =>{
//   switch (action.type){
//     case 'CHANGE_DISTRICT':
//       return {...state, district: action.district}
//       default:
//         return state;
//   }
//   return state;
// }

// const store = createStore(reducer);

class App extends React.Component {
  render() {
    return (
      // <Provider store={store}>
        <Map / >
      // </Provider>
    )
  }
}

export default App;
  

reducer.js

 export const initialState = {
  district: ''
};

export const reducer = (state = initialState, action) =>{
  switch (action.type){
    case 'CHANGE_DISTRICT':
      return {...state, district: action.district}
      default:
        return state;
  }
  return state;
}
  

Map.js

 import React from 'react';
import L from 'leaflet';
import { connect } from 'react-redux';

const mapStateToProps = state => {
  return {
    district: state.district
  };
}

class Map extends React.Component {

  componentDidMount() {
    // create map
    this.map = L.map('map').setView([31.15, -99.90], 6);
    L.tileLayer('https://{s}.tile.thunderforest.com/pioneer/{z}/{x}/{y}.png?', {
      attribution: 'Pioneer Basemap by Thunderforest, a project by Gravitystorm Limited.'
    }).addTo(this.map);
  }
  render() {
    const mapStyle = {
      height: '500px',
      width: '100%'
    }

    return <div id = "map" style={mapStyle}> < /div>
  }
}


export default connect(mapStateToProps)(Map);
  

Ответ №1:

Хранилище должно работать с внесенными вами изменениями, но для активации расширения требуется дополнительный шаг

  const store = createStore(
   reducer,
   window.__REDUX_DEVTOOLS_EXTENSION__ amp;amp; window.__REDUX_DEVTOOLS_EXTENSION__()
 );
  

https://github.com/zalmoxisus/redux-devtools-extension#1-with-redux

Ответ №2:

  const initialState = {
 district: ''
};    

const reducer=(state = initialState, action)=>{
 switch (action.type){
case 'CHANGE_DISTRICT':
  return {...state, district: action.district}
  default:
    return state;
 }
 return state;
}
  

вы можете это проверить. теперь это работает

Комментарии:

1. Все еще не работает. Теперь я получаю синтаксическую ошибку: SyntaxError: …/frontend/src/App.js: Неожиданный токен, ожидаемый «;» (15:46)

2. Это устранило ошибку. Спасибо, что поймали мою отсутствующую функцию стрелки. Однако инструмент разработки redux по-прежнему сообщает, что хранилища нет.

3. согласно документам, reducer должен быть инициализирован в index.js в какой родительский компонент вы можете попробовать обернуть приложение index.js

4. Вы имеете в виду делать что-то вроде этого? ReactDOM.render( <Provider store={store}> < App / > </Provider> , document.getElementById("root")); Я также перенес логику редуктора в index.js файл. По-прежнему нет хранилища в redux devtool

5. Я внес изменения в index.js как вы и предлагали. Хранилище по-прежнему не отображается. Какие-либо другие рекомендации?