Javascript 无法读取属性';类型';未定义的类型(react路由器redux)
我正在尝试在注销后重定向到该页面。但是,每次我注销时,它都会成功引导页面。然而,我仍然得到了错误 无法读取未定义的属性“type” 通过“捕获异常时暂停”进一步研究,它与react router redux有关 因此,下面代码中的行Javascript 无法读取属性';类型';未定义的类型(react路由器redux),javascript,reactjs,react-redux,react-router-redux,redux-observable,Javascript,Reactjs,React Redux,React Router Redux,Redux Observable,我正在尝试在注销后重定向到该页面。但是,每次我注销时,它都会成功引导页面。然而,我仍然得到了错误 无法读取未定义的属性“type” 通过“捕获异常时暂停”进一步研究,它与react router redux有关 因此,下面代码中的行store.dispatch(push('/sign'))导致了问题。如果我更改为.map(()=>({type:'NOT_EXIST'})),将不会出现问题 这可能是什么原因造成的?谢谢 actions/auth.action.js export const si
store.dispatch(push('/sign'))
导致了问题。如果我更改为.map(()=>({type:'NOT_EXIST'}))代码>,将不会出现问题
这可能是什么原因造成的?谢谢
actions/auth.action.js
export const signOutSucceedEpic = (action$, store) =>
action$
.ofType(SIGN_OUT_SUCCEED)
.map(() => store.dispatch(push('/signin'))); // <- this line causes the issue
import { combineEpics } from 'redux-observable';
export default combineEpics(
// ...
signOutSucceedEpic
);
import { Provider } from 'react-redux';
import { Route } from 'react-router-dom';
import { ConnectedRouter, routerMiddleware, push } from 'react-router-redux';
import createHistory from 'history/createBrowserHistory';
import rootEpic from './actions/index';
const history = createHistory();
const routeMiddleware = routerMiddleware(history);
const epicMiddleware = createEpicMiddleware(rootEpic);
export const store = createStore(
rootReducer,
persistedState,
composeWithDevTools(
applyMiddleware(
epicMiddleware,
routeMiddleware
)
)
);
ReactDOM.render(
<Provider store={store}>
<ConnectedRouter history={history}>
<div>
<Route path="/signin" component={SignIn} />
<Route exact path="/" component={Home} />
</div>
</ConnectedRouter>
</Provider>,
document.getElementById('root')
);
index.js
export const signOutSucceedEpic = (action$, store) =>
action$
.ofType(SIGN_OUT_SUCCEED)
.map(() => store.dispatch(push('/signin'))); // <- this line causes the issue
import { combineEpics } from 'redux-observable';
export default combineEpics(
// ...
signOutSucceedEpic
);
import { Provider } from 'react-redux';
import { Route } from 'react-router-dom';
import { ConnectedRouter, routerMiddleware, push } from 'react-router-redux';
import createHistory from 'history/createBrowserHistory';
import rootEpic from './actions/index';
const history = createHistory();
const routeMiddleware = routerMiddleware(history);
const epicMiddleware = createEpicMiddleware(rootEpic);
export const store = createStore(
rootReducer,
persistedState,
composeWithDevTools(
applyMiddleware(
epicMiddleware,
routeMiddleware
)
)
);
ReactDOM.render(
<Provider store={store}>
<ConnectedRouter history={history}>
<div>
<Route path="/signin" component={SignIn} />
<Route exact path="/" component={Home} />
</div>
</ConnectedRouter>
</Provider>,
document.getElementById('root')
);
从'react redux'导入{Provider};
从'react router dom'导入{Route};
从“react router redux”导入{ConnectedRouter,routerMiddleware,push};
从“历史记录/createBrowserHistory”导入createHistory;
从“/actions/index”导入rootEpic;
const history=createHistory();
const routeMiddleware=routerMiddleware(历史);
const-epicMiddleware=createEpicMiddleware(rootEpic);
export const store=createStore(
减根剂,
持续状态,
组合工具(
applyMiddleware(
伊壁鸠鲁,
路由软件
)
)
);
ReactDOM.render(
,
document.getElementById('root'))
);
问题是您正在调用store.dispatch
在map
操作符中,映射到该store.dispatch()的返回值,但它不返回任何内容,因此未定义的值由epic发出,然后由代表您的redux observable发送。然后react router redux接收到未定义的
值,但它假定只调度具有类型
属性的操作,因此它会导致有问题的错误
我建议将redux可观察文档重新检查为调用store。直接在您的epics中分派是一种反模式,不必要。您的epic应该发出一系列操作,这些操作将由redux observable为您分派,因此在这种情况下,您可以删除存储区。分派
,而是映射到推送()操作的结果:
export const signOutSucceedEpic = (action$, store) =>
action$
.ofType(SIGN_OUT_SUCCEED)
.map(() => push('/signin'));
我想您忘记指定类型了,请这样写:store.dispatch({type:'abc',data:push('/sign')})代码>检查示例。非常感谢!!只需在这里输入正确的代码.map(()=>push('/sign')你在写些废话push('/sign')
确实返回未定义的。看看这里,用你的理论解释为什么dispatch(push('/sign')
在该示例中运行良好,并在OP的问题中抛出。@Green此答案修复了他的特定问题。从react router redux
调用push
不会返回undefined
,它会返回您分派的操作。直接使用它调用dispatch确实会导致转换,但如果在map
中执行此操作,您将收到与OP相同的错误,因为您的epic应该始终发出动作,而不是未定义的
。直接在epics内部使用store.dispatch
是一种反模式,将在redux observable的v1.0.0中删除,以防止混淆。相反,epics应该发出中间件将为您分派的操作。事实证明,我调用了一个连接到调度器的方法,该方法没有返回操作(它正在调度其他操作,但本身没有)。取消连接该方法解决了我的问题。