Reactjs React Router with RefluxJS-从商店以编程方式更改路由

Reactjs React Router with RefluxJS-从商店以编程方式更改路由,reactjs,react-router,refluxjs,Reactjs,React Router,Refluxjs,在我的项目中,我加入了React路由器。我的一个回流商店需要根据一些BL找出路径,然后改变它。首先,我尝试将导航混入商店并运行this.transitiono(“Foo”)引发错误:“未捕获的TypeError:无法读取未定义的属性'router' 有人建议:“this.transitiono可能是通过RefluxJS存储中不存在的上下文(this.context.router)访问路由器属性”。。。我明白 但是,必须有一种方法以编程方式从存储区或任何给定的外部JS模块更改路由器路径 我的代码是

在我的项目中,我加入了React路由器。我的一个回流商店需要根据一些BL找出路径,然后改变它。首先,我尝试将
导航
混入商店并运行
this.transitiono(“Foo”)引发错误:“未捕获的TypeError:无法读取未定义的属性'router'

有人建议:“
this.transitiono
可能是通过RefluxJS存储中不存在的上下文(
this.context.router
)访问路由器属性”。。。我明白

但是,必须有一种方法以编程方式从存储区或任何给定的外部JS模块更改路由器路径

我的代码是这样的:

//routes.js
//////////////////////////////////////////////////////////
var-Router=require('react-Router');
var-Route=路由器.Route;
var-App=require('./App');
var Comp=需要('./组件/Comp');
变量路由=(
);
module.exports=路线;
//main.js
//////////////////////////////////////////////////////////
var React=要求('React');
var-Router=require('react-Router');
变量路由=需要('./路由');
var appElement=document.getElementsByTagName('body');
Router.run(路由、Router.HistoryLocation、函数(根、状态){
反应。呈现(,外观);
});
//comp.js
//////////////////////////////////////////////////////////
var React=要求(“React”);
var回流=需要(“回流”);
var Actions=require(“../Actions/Actions.js”);
var SomeStore=require(“../stores/some store.js”);
var Comp=React.createClass({
render:function(){
返回(
你好,世界
);
}
});
module.exports=Comp;
//store.js
//////////////////////////////////////////////////////////
var SomeStore=reflow.createStore({
onSomeAction:function(){
//将此处的路由器路径更改为/foo
}
});

module.exports=SomeStore回流操作返回一个承诺,因此您可以在组件中执行,而不是在存储中执行此操作(IMO是错误的):

Actions.someAction().then(function() {
    // route transition
});

这是否完全正确。。。嗯,我不确定社区是否真的确定了意见。

路由器只由组件(反应视图)知道。您需要将路由器作为操作中的参数从上下文中传递。这样,可以使用此参数转换到其他管线。我一直这样使用它

我在商店里的一个动作监听器中有如下内容

 _onMyAction: function (router) {
    MyApi.doSomething()
        .then(function (id) {
            // do something ...
            router.transitionTo('myNewRoute', { ref: id });
        })
        .catch(function(message) {
            // handle message
        });
}

我个人认为组件应该对某些存储状态做出反应,以确定是否转换。因此,存储在操作处理后更新,并且组件像往常一样侦听存储更改。根据存储数据的某些条件,组件将转换到不同的路由。是的,这当然是可能的。react router网站上曾经有一个关于在flux旁边使用它的指南,其中提到有一个routes商店: