Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 无法读取属性';类型';未定义的类型(react路由器redux)_Javascript_Reactjs_React Redux_React Router Redux_Redux Observable - Fatal编程技术网

Javascript 无法读取属性';类型';未定义的类型(react路由器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

我正在尝试在注销后重定向到该页面。但是,每次我注销时,它都会成功引导页面。然而,我仍然得到了错误

无法读取未定义的属性“type”

通过“捕获异常时暂停”进一步研究,它与react router redux有关

因此,下面代码中的行
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应该发出中间件将为您分派的操作。事实证明,我调用了一个连接到调度器的方法,该方法没有返回操作(它正在调度其他操作,但本身没有)。取消连接该方法解决了我的问题。