Я довольно новыми реагировать, и я использую react-boilerplate + материал-щРеагировать Redux маршрутизатор сага материал-интерфейса и вкладки, соответствующие текущему маршруту
И Я хочу иметь возможность изменить текущую вкладку, чтобы она изменила текущий маршрут и наоборот. Также при обновлении страницы с помощью маршрута она должна перейти на правую вкладку.
Так у меня есть tabpagechooser компонент контейнера таким образом:
index.js:
/*
*
* TabsPageChooser
*
*/
import React, { PropTypes } from 'react';
import { connect } from 'react-redux';
import { FormattedMessage } from 'react-intl';
import { createStructuredSelector } from 'reselect';
import { changeTab } from './actions';
import makeSelectTab from './selectors';
import messages from './messages';
import {Tabs, Tab} from 'material-ui/Tabs';
import FontIcon from 'material-ui/FontIcon';
export class TabsPageChooser extends React.Component { // eslint-disable-line react/prefer-stateless-function
constructor(props) {
super(props)
this.handleHome = this.props.onChangeTab.bind(null, 0);
this.handleSettings = this.props.onChangeTab.bind(null, 1);
this.handleAbout = this.props.onChangeTab.bind(null, 2);
}
render() {
console.log(this.props);
return (
<Tabs initialSelectedIndex={this.props.tab.tabIdx} >
<Tab
icon={<FontIcon className="material-icons">home</FontIcon>}
label={<FormattedMessage {...messages.home} />}
onActive={this.handleHome} />
<Tab
icon={<FontIcon className="material-icons">settings</FontIcon>}
label={<FormattedMessage {...messages.settings} />}
onActive={this.handleSettings} />
<Tab
icon={<FontIcon className="material-icons">favorite</FontIcon>}
label={<FormattedMessage {...messages.about} />}
onActive={this.handleAbout} />
</Tabs>
);
}
}
TabsPageChooser.propTypes = {
onChangeTab: React.PropTypes.func,
};
const mapStateToProps = createStructuredSelector({
tab: makeSelectTab(),
});
function mapDispatchToProps(dispatch) {
return {
onChangeTab: (tabId) => {
dispatch(changeTab(tabId));
},
};
}
export default connect(mapStateToProps, mapDispatchToProps)(TabsPageChooser);
actions.js:
/*
*
* TabsPageChooser actions
*
*/
import {
ROUTES_ID,
CHANGE_TAB,
} from './constants';
export function changeTab(tabId) {
return {
type: CHANGE_TAB,
tab: tabId,
};
}
export function urlFromId(tabId) {
if (!(tabId > 0 && tabId < ROUTES_ID)) {
return '/';
}
return ROUTES_ID[tabId];
}
export function changeTabFromUrl(url) {
console.log(url);
return changeTab(ROUTES_ID.indexOf(url));
}
constants.js:
/*
*
* TabsPageChooser constants
*
*/
export const CHANGE_TAB = 'app/TabsPageChooser/CHANGE_TAB';
export const ROUTES_ID = [
'/',
'/settings',
'/about',
];
reducer.js:
/*
*
* TabsPageChooser reducer
*
*/
import { fromJS } from 'immutable';
import {
CHANGE_TAB,
} from './constants';
const initialState = fromJS({
tabIdx: 0,
});
function tabsPageChooserReducer(state = initialState, action) {
switch (action.type) {
case CHANGE_TAB:
return state.set('tabIdx', action.tab);
default:
return state;
}
}
export default tabsPageChooserReducer;
sagas.js:
import { take, call, put, select, takeLatest, takeEvery } from 'redux-saga/effects';
import { push } from 'react-router-redux';
import { changeTabFromUrl, urlFromId } from 'containers/TabsPageChooser/actions';
import { makeSelectTab } from 'containers/TabsPageChooser/selectors';
import { CHANGE_TAB } from 'containers/TabsPageChooser/constants';
import { LOCATION_CHANGE } from 'react-router-redux';
function* doChangeTab(action) {
//Act as dispatch()
yield put(changeTabFromUrl(action.payload.pathname));
}
function* doChangeUrl(action) {
//Act as dispatch()
yield put(push(urlFromId(action.tab.tabId)));
}
// Individual exports for testing
export function* defaultSagas() {
yield takeEvery(LOCATION_CHANGE, doChangeTab);
yield takeEvery(CHANGE_TAB, doChangeUrl);
}
// All sagas to be loaded
export default [
defaultSagas,
];
Моя проблема заключается в том, что особенно последний файл, событие LOCATION_CHANGE, вызвать действие changeTab, который, в свою очередь вызвать событие CHANGE_TAB, которые вызывают изменение местоположения и т.д .. .,
Что я делаю неправильно, как мне это сделать?