首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使中继和响应路由工作正常?

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

Stack Overflow用户
提问于 2016-04-18 06:53:02
回答 1查看 2.9K关注 0票数 4

我从中继开始,并试图使我的路由工作正常。不幸的是,我运气不太好。

下面是我遇到的错误:

Uncaught : Component.getFragment不是函数

下面是我的代码,供您参考:

index.jsx

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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,但得到undefined。如果这是有意的,则传递一个显式null

以下是一些变化:

index.jsx

代码语言:javascript
复制
const AppQueries = {
  store: () => Relay.QL `query {
    store 
  }`
};

app.jsx

代码语言:javascript
复制
import Home from "./home";

...

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-18 11:38:34

片段定义实际上并不将组件作为参数,而是容器的变量映射,您只需要使用它们就可以根据变量值拥有条件片段。

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

以下是您需要做的更改。

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

index.jsx

代码语言:javascript
复制
const AppQueries = {
  store: () => Relay.QL `query {
    store 
  }`
};

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

代码语言:javascript
复制
export default class App extends Component {

如果需要向其传递一些中继数据,则不需要包含子片段,因为只有在将其他容器直接呈现为直接子容器(而不是作为this.props.children)时,才需要包含片段。

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

代码语言:javascript
复制
ReactDOM.render(
  <RelayRouter history={browserHistory}>
    <Route path='/' component={App}>
      <IndexRoute component={Home} queries={AppQueries} />
    </Route>
  </RelayRouter>, 
document.getElementById('ch-root'));
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36687203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档