【问题标题】:React Relay always force fetch Route or RelayContainerReact Relay 总是强制获取 Route 或 RelayContainer
【发布时间】:2016-09-24 16:10:04
【问题描述】:

是否可以定义中继容器或<Route/> 在安装时(或之前)始终强制获取?

我可以在componentDidMount 中执行this.props.relay.forceFetch(),但这有点难看 + 如果是初始页面加载,则会执行两个请求。

【问题讨论】:

  • 你在做forceFetch,因为数据经常变化吗?我的意思是您是否尝试这样做作为缺乏订阅支持的解决方法?
  • @AhmadFerdous:考虑以下交互:显示<ListContainer/>,导航到<ItemViewContainer/>,返回到<ListContainer/>。我想确保 ListContainer 中的数据永远不会过时。即使有订阅支持,我认为这也解决不了这个问题。
  • 我有同样的问题。是的,缺少订阅支持,但这无关紧要。我的服务器无论如何都不支持它。每次渲染组件时,我都需要重新轮询数据。但不是现在的两倍。

标签: reactjs relayjs


【解决方案1】:

一个更优雅的解决方案是使用Relay.Renderer forceFetch,它将从服务器中提取新数据,而不管组件的当前数据状态如何。 它可以与文档中的 react-relay-router 一起使用:

<Router
    history={history}
    routes={routes}
    render={applyRouterMiddleware(useRelay)}
    forceFetch={true}
    environment={Relay.Store}
/>

【讨论】:

    【解决方案2】:

    这样定义片段:

    export default Relay.createContainer(Component, {
      initialVariables: { show: false },
      fragments: {
        viewer: (): string => Relay.QL`
          fragment on Viewer  {
            messages @include(if: $show) {
               id
            }
          }
        `,
      },
    })
    

    然后

    componentDidMount() {
        this.props.relay.forceFetch({ show: true })
    }
    

    这种方式组件只会加载一次。并且在您重新安装它时将始终重新获取。 请注意,如果这是顶级组件,您可能会收到错误,因为您没有获取任何数据。 我添加了对用户 ID 的请求作为临时 hack,我的 graphql 服务器可以更快地解决它。

    【讨论】:

      猜你喜欢
      • 2017-11-27
      • 2016-02-01
      • 2017-02-18
      • 2018-12-06
      • 2022-11-02
      • 2017-12-22
      • 2018-01-03
      • 2016-11-19
      • 2018-12-26
      相关资源
      最近更新 更多