@SweetPony1

Как в Redux подписаться на события из компонента?

Как в Redux подписаться на события из компонента?
Для разработки используется CREATE-REACT-APP
Все ответы которые удалось найти, касаются более упрощенной структуры проекта.
store.subscribe(() => {
  console.log(store.getState().lastAction);
});

Но у меня проект такого типа
https://monsterlessons.com/project/categories/redux
Основная задача подписки на dispatch type в том, что бы actions из разных файлов не имели понятия о существовании друг друга.
EVENT1 и EVENT2 запускаются из разных файлов, import EVENT2 в EVENT1 неверное решение, тем более мешает dispatch =>
При такой схеме проекта, не могу найти где подписаться на изменения.
Для форума сделал упрощенный пример
index.js
import React from 'react'
import ReactDOM from 'react-dom'
import { Provider } from 'react-redux'
import { createStore, applyMiddleware } from 'redux'
import { composeWithDevTools } from 'redux-devtools-extension'
import thunk from 'redux-thunk'
import { Router, Route, hashHistory } from 'react-router'
import { syncHistoryWithStore } from 'react-router-redux'
import App from './App'
import reducer from './reducers'
const store = createStore(reducer, composeWithDevTools(applyMiddleware(thunk)));
const history = syncHistoryWithStore(hashHistory, store);
ReactDOM.render(
  <Provider store={store}>
    <Router history={history}>
      <Route path="/" component={App} />
    </Router>
  </Provider>,
  document.getElementById('root')
);


reducers
export default function reducer1(state = initialState, action) {
  switch (action.type) {
    default: {
      return state;
}

action1
export const action1 = (data) => dispatch => {
  dispatch({ type: 'EVENT1', payload: {value1:1} })
}

action2
export const action2 = (data) => dispatch => {
  dispatch({ type: 'EVENT2', payload: {value2:2} })
}

Component
import * as action1 from './actions/action1';
import * as action2 from './actions/action2';
class App extends Component {
  componentDidMount() {
      this.props.state.reducer1.subscribe( ()=>{
       /*мои представления о работе подписки, тут мы имеем доступ к EVENT1 и EVENT2*/
      } )
  }
  render() {
      return (<div></div>)
  }
}
export default connect(
    (state, props, ownProps) => ({
        state: state,
        props: props
    }),
    actions1,actions2
)(App)

но в моем случае
this.props.state.reducer1.value1
не имеет таких функций как getState() и subscribe()
  • Вопрос задан
  • 2926 просмотров
Пригласить эксперта
Ответы на вопрос 2
Zatmil
@Zatmil
Fullstack-разработчик
Мне кажется, что нужно посмотреть в сторону middleware и сделать обертку, в которой уже вызывать нужные экшены

const MyMiddleware = store => next => action => {
  switch(action.type) {
    case 'SOME_EVENT_TYPE': {
       store.dispatch(action)
    }
    default:
      return next(action)
  }
}
Ответ написан
Комментировать
gatilin222
@gatilin222
Frontend-разработчик
Вы идете не тем путем, у вас архитектурная ошибка. Зачем подписываться из компонента на экшн? Пусть экшн меняет что-нибудь в Redux store и обновленные данные приходят в компонент.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы