我有一个反应App,数据流由RxJS驱动 - > here
我使用RxJS订阅了我的数据存储,并将其作为道具传递给应用程序:
Model.subject.subscribe((appState) => {
React.render(
<App {...appState}/>,
document.getElementById('app')
);
});
下面是反应路由器通常如何自我渲染:
Router.run(routes, function (Handler) {
React.render(
<Handler />,
document.getElementById('app')
);
});
这是我到目前为止所提出的反应路由器正常但数据appState
没有通过<handler />
但它在React.render
<之前正常注销/ p>
Router.run(routes, function (Handler) {
Model.subject.subscribe((appState) => {
console.log(appState); // the state passes here
React.render(
<Handler {...appState}/>, // the state doesn't pass here
document.getElementById('app')
);
});
});
现在有没有办法合并RxJS数据订阅并通过React-Router?
以下是完整的解决方案,请注意<Handler {...appState}/>
,它会将数据传递到应用中,但您需要通过道具<RouteHandler {...this.props} />
传递数据
var App = React.createClass({
render: function () {
return (
<div>
<header>
<ul>
<li><Link to="app">Home</Link></li>
<li><Link to="about">About</Link></li>
<li><Link to="login">Login</Link></li>
</ul>
</header>
<RouteHandler {...this.props} />
</div>
);
}
});
var routes = (
<Route name="app" path="/" handler={App}>
<Route name="about" handler={About}/>
<Route name="login" handler={Login}/>
<DefaultRoute handler={Home}/>
</Route>
);
Router.run(routes, function (Handler) {
Model.subject.subscribe((appState) => {
React.render(
<Handler {...appState}/>,
document.getElementById('app')
);
});
});
答案 0 :(得分:2)
您确定您的处理程序是否正在使用Handler
组件中传播道具的方式?
无论哪种方式,您实施它的方式只会在首先路由更改然后更改为observable时呈现任何内容。如果路线发生变化但没有后续的可观察变化,则不会进行任何变更。
您希望在路径更改发生时以及在observable中发生更改时呈现这两者。尝试这样的事情:
var CurrentHandler = null;
var currentAppState = {};
Router.run(routes, function (Handler) {
CurrentHandler = Handler;
render();
});
Model.subject.subscribe((appState) => {
currentAppState = appState;
render();
});
function render() {
// Cannot render before we have a handler
if (!CurrentHandler) return;
React.render(
<CurrentHandler {...currentAppState} />,
document.getElementById('app')
);
}
修改强>
您正在做的是您拥有App
组件,该组件是其他处理程序的父路由处理程序(Home
,Login
和About
) 。因此,当路线更改为/login
时,系统会调用您的App
组件,并将appState
作为道具展开。 App
然后呈现RouteHandler
,然后呈现Login
组件(因为那是路由匹配的内容)。但是Login
没有获得appState
作为道具,因为您没有从App
传递它们。
如果您更改App
以呈现<RouteHandler {...this.props} />
而不是<RouteHandler />
,则会将所有App
道具传递给RouteHandler
,然后将其传递给Login
到<button id="btn_out" name="btn_in_out" class="btn btn-lg btn-danger primary col-xs-offset-7" type="submit" onclick="sayThanks()" value="out">Ut</button>
function sayThanks(){
var tE = document.getElementById('btn_out');
if (tE) tE.innerHTML = 'Tack';
}
。