3

也许这是一个非常具体的问题,但我相信它会找到解决方案。我发现很多人在登录/注销后询问环境变化。

我正在使用 redux 来存储有关登录、模式、表单等的应用程序状态逻辑,并中继以获取数据。登录/注销后,我使用连接的路由器触发新环境的重新渲染

const RelayApp = connect(_ => ({
  routes: routes,
  environment: environment,
  history: browserHistory,
  render: applyRouterMiddleware(useRelay)
}))(Router);

ReactDOM.render(
  <Provider store={store}>
    <RelayApp />
  </Provider>,
  document.getElementById('root')
);

我的路线定义如下:

export default (renderAppRoute) => (
  <Route render={renderAppRoute} path="/" component={App} queries={AppQueries} >
    <IndexRoute component={UserList} queries={UserListQueries}/>
    <Route path=":username" component={User} queries={UserQueries} />
  </Route>
);

renderAppRoute 函数定义了在不同的中继状态下渲染什么,比如如果正在获取完成

const renderAppRoute = ({ done, props, element }) => {
  if(props) { //it's loaded
    React.cloneElement(element, props);
  }
  return <h1>Loading...</h1>;
};

在我更改环境后,我得到了错误(index):7 Uncaught TypeError: Cannot read property 'user' of undefined(…)。这是因为在初始提取时,道具未定义并且正在进行提取。在道具中完成获取后,您可以找到 RelayContainer 等的片段定义。但是在切换到新环境后,道具永远不会未定义,因此它正在渲染我的组件但没有存储数据。是否有可能以某种方式检测或者是否有某种方法可以识别环境是否是新的,或者我们是否需要在用户端创建一些自定义逻辑?

我目前正在使用isNewEnvironment我设置为 true 的新变量来创建它,当我创建新环境时,设置为falserenderAppRoute之后params.donetrue

4

0 回答 0