4

我从 Relay 开始,并试图让我的路由正常工作。不幸的是,我运气不佳。

这是我得到的错误:

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

这是我供您参考的代码:

索引.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'));

应用程序.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;

主页.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. 我现在收到此错误:

警告:RelayContainer:预期道具store将提供给 Home,但得到undefinednull如果这是故意的,请传递一个明确的。

以下是更改:

索引.jsx

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

应用程序.jsx

import Home from "./home";

...

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

1 回答 1

4

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

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

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

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

索引.jsx

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

您的 App 组件实际上不使用任何中继数据,因此您可以只导出普通组件而不是容器。

export default class App extends Component {

如果您需要将一些 Relay 数据传递给它,则不需要包含子片段,因为仅当您将其他容器直接渲染为直接子项(而不是 this.props.children)时才需要包含片段。

然后在路由器中,您需要将查询移动到主页。

ReactDOM.render(
  <RelayRouter history={browserHistory}>
    <Route path='/' component={App}>
      <IndexRoute component={Home} queries={AppQueries} />
    </Route>
  </RelayRouter>, 
document.getElementById('ch-root'));
于 2016-04-18T11:38:34.917 回答