onEnter转换与反应路由器和Redux简单路由器不要渲染新的路由组件

时间:2016-01-21 16:52:34

标签: javascript reactjs react-router redux react-router-redux

我有一个应用程序使用react @ 0.14,redux @ 3.05,react-router @ 1.0.3和redux-simple-router @ 2.0.2。我尝试根据存储状态为某些路由配置onEnter转换。转换挂钩成功触发并将新状态推送到我的商店,这会更改网址。但是,在页面上呈现的实际组件是路由匹配的原始组件处理程序,而不是新URL的新组件处理程序。

以下是我的routes.js文件的样子

export default function configRoutes(store) {
  const authTransition = function authTransition(location, replaceWith) {
    const state = store.getState()
    const user = state.user

    if (!user.isAuthenticated) {
      store.dispatch(routeActions.push('/login'))
    }
  }

  return (
    <Route component={App}>
      <Route path="/" component={Home}/>
      <Route path="/login" component={Login}/>
      <Route path="/dashboard" component={Dashboard} onEnter={authTransition}/>
      <Route path="/workouts" component={Workout} onEnter={authTransition}>
        <IndexRoute component={WorkoutsView}/>
        <Route path="/workouts/create" component={WorkoutCreate}/>
      </Route>
    </Route>
  )
}

这是我的Root.js组件,它被插入到DOM

export default class Root extends React.Component {
  render() {
    const { store, history } = this.props
    const routes = configRoutes(store)

    return (
      <Provider store={store}>
        <div>
          {isDev ? <DevTools /> : null}
          <Router history={history} children={routes} />
        </div>
      </Provider>
    )
  }
}

澄清一下,如果我去&#39; / workouts&#39;,它将触发onEnter authTransition挂钩,发送redux-simple-router推送操作,将网址更改为&#39; / login&#39 ;,但会在页面上显示Workout组件。查看Redux DevTools显示state -> router -> location -> pathname是&#39; / login&#39;。

状态流是

  1. @@ INIT
  2. @@ ROUTER / UPDATE_LOCATION(/ workouts)
  3. @@ ROUTER / UPDATE_LOCATION(/ login)
  4. 我是否错误地将商店送到了路线?我无法弄清楚为什么下一个Router / Update_Location无法正常工作

1 个答案:

答案 0 :(得分:12)

原来你想使用react-router api(替换),而不是redux-simple-router来控制你的转换。

    #include <systemc.h>
    #include "alu.h"
    #include "barrelshift.h"

    int sc_main(int argc, char* argv[]){
sc_trace_file *tf; 

//Signals
sc_signal <bool> enable, op, l_r;
sc_signal <sc_int<8> > a, output,b, bin;
sc_signal < sc_uint<3> > shift_amt;

//Clock
sc_clock clk("clk",10,SC_PS,0.5);

alu myALU("myALU");
barrel_shift myShifter("myShifter");

myALU.a(a);
myALU.b(b);
myALU.output(output);
myALU.op(op);

myShifter.clk(clk);
myShifter.din(bin);
myShifter.enable(enable);
myShifter.left_right(l_r);
myShifter.shift_amt(shift_amt);
myShifter.dout(b);

tf = sc_create_vcd_trace_file("trace_file");
sc_trace(tf, clk, "clk");
sc_trace(tf, a, "a");
sc_trace(tf, bin, "BarrelShifter In");
sc_trace(tf, op, "op");
sc_trace(tf, shift_amt, "shift_amt");
sc_trace(tf, l_r, "left_right");
sc_trace(tf, enable, "enable");
sc_trace(tf, b, "b");
sc_trace(tf, output, "output");



sc_close_vcd_trace_file(tf);

cout << "The result from the ALU is: " << output.read();
}

另外,要小心。我在那里看到了很多文件,用于反应路由器替换传递单个对象的地方。那就是react-router 2.0-rc *。如果您正在使用react-router 1.0,那么您将要传递替换3个单独的参数。