如何使中继和反应路由正常工作?

时间:2016-04-18 06:53:03

标签: reactjs react-router relayjs react-router-relay

我开始使用Relay并尝试使我的路由正常工作。 不幸的是,我没有太多运气。

以下是我遇到的错误:

  

未捕获的TypeError:Component.getFragment不是函数

以下是我参考的代码:

index.jsx

import React from 'react';
import ReactDOM from 'react-dom';
import Relay from 'react-relay';
import {Router, Route, IndexRoute, browserHistory} from 'react-router';
import {RelayRouter} from 'react-router-relay';

import App from './modules/app';
import Home from './modules/home';

const AppQueries = {
  store: (Component) => Relay.QL `query {
    store {
      ${Component.getFragment('store')}
    }
  }`
};

ReactDOM.render(
  <RelayRouter history={browserHistory}>
    <Route path='/' component={App} queries={AppQueries}>
      <IndexRoute component={Home}/>
    </Route>
  </RelayRouter>, 
document.getElementById('ch-root'));

app.jsx

import React, {Component} from 'react';
import Relay from 'react-relay';
import Header from './ui/header';
import Footer from './ui/footer';

class App extends Component {
  render() {
    return (
      <div id="ch-container">
        <Header/>
        <section id="ch-body">
          {this.props.children}
        </section>
        <Footer/>
      </div>
    );
  }
}

App = Relay.createContainer(App, {
  fragments: {
    store: (Component) => Relay.QL `
      fragment on Store {
        ${Component.getFragment('store')}
      }
     `
  }
});

export default App;

home.jsx

import React, {Component} from 'react';
import Relay from 'react-relay';
import Loader from './ui/loader';
import AccountSelector from './account/account-selector';

const APP_HOST = window.CH_APP_HOST;
const CURR_HOST = `${window.location.protocol}//${window.location.host}`;

class Home extends Component {
  state = {
    activeAccount: null,
    loading: true
  }

  render() {
    const {activeAccount, loading} = this.state;

    if (loading) {
      return <Loader/>;
    }

    if (!activeAccount && !loading) {
      return <AccountSelector/>;
    }

    return (
      <h1>Hello!</h1>
    );
  }
}

Home = Relay.createContainer(Home, {
  fragments: {
    store: () => Relay.QL `
      fragment on Store {
        accounts {
          unique_id,
          subdomain
        }
      }
     `
  }
});

export default Home;

更新

freiksenet建议我做了一些更改,如下所示。但这引发了以下两个问题:

  1. 当我更改路线并且Home以外的组件由App组件呈现时会发生什么?
  2. 我现在收到此错误:
  3.   

    警告:RelayContainer:要提供的预期道具store   Home,但获得undefined。如果是,则传递明确的null   故意的。

    以下是更改:

    index.jsx

    const AppQueries = {
      store: () => Relay.QL `query {
        store 
      }`
    };
    

    app.jsx

    import Home from "./home";
    
    ...
    
    App = Relay.createContainer(App, {
      fragments: {
        store: () => Relay.QL `
          fragment on Store {
            ${Home.getFragment('store')}
          }
         `
      }
    });
    

1 个答案:

答案 0 :(得分:4)

片段定义实际上并没有将Components作为参数,而是容器的变量映射,您只需要使用它们来根据变量值获得条件片段。

中继路由查询不接受任何参数。

以下是您需要进行的更改。

在Relay中的路由查询只需要指定要在此路由中检索的根查询,而不需要片段。

index.jsx

const AppQueries = {
  store: () => Relay.QL `query {
    store 
  }`
};

您的应用程序组件实际上并没有使用任何中继数据,因此您只能导出普通组件而不是容器。

export default class App extends Component {

如果您需要将一些Relay数据传递给它,则不需要包含子片段,因为只有在您将其他容器直接渲染为直接子节点时才需要包含片段(不是这样)。 props.children)。

然后在路由器中,您需要将查询移至Home。

ReactDOM.render(
  <RelayRouter history={browserHistory}>
    <Route path='/' component={App}>
      <IndexRoute component={Home} queries={AppQueries} />
    </Route>
  </RelayRouter>, 
document.getElementById('ch-root'));