标签: react-router-relay

使用react-router-relay类型扩充反应路由器模块

默认的react-router用作如下:

import * as React from 'react';
import { Router, Route, hashHistory } from 'react-router';

const routing = (
    <Router history={hashHistory}>
        <Route path="/login" component={Login}/>
    </Router>   
};
Run Code Online (Sandbox Code Playgroud)

当我包含"react-router-relay"库时,它会为路由器添加功能.即它为路由器组件添加了2个属性(渲染和环境):

import * as React from 'react';
import * as Relay from 'react-relay';
import * as useRelay from 'react-router-relay';
import { Router, Route, hashHistory, applyRouterMiddleware } from 'react-router';

const routing = (
    <Router history={hashHistory} render={applyRouterMiddleware(useRelay)} environment={Relay.Store}>
        <Route path="/login" component={Login}/>
    </Router>   
};
Run Code Online (Sandbox Code Playgroud)

我将如何增加反应路由器的类型?

我尝试过一系列方法,最新的方法是:

import { Router } from 'react-router';

declare module 'react-router' {
    namespace …
Run Code Online (Sandbox Code Playgroud)

typescript reactjs relayjs react-router-relay

15
推荐指数
1
解决办法
437
查看次数

如何将数据连接到react-router-relay中的深层组件?

我有这样的路线

<Route path="/search" component={Search}>
Run Code Online (Sandbox Code Playgroud)

基本Search组件看起来像这样

class Search extends React.Component {
  constructor (props) {
    super(props)
    this.state = {query: ''}
  }
  handleSubmit (event) {
    event.preventDefault()
    this.setState({query: this.refs.queryInput.value})
  }
  renderSearchResult() {
    if (this.state.query === '')
      return <EmptySearchResult />
    else
      return <SearchResult query={this.state.query}/>
  }
  render() {
    return (
      <div className="searchContainer">
        <div className="row">
          <div className="search">
            <form onSubmit={event => this.handleSubmit(event)}>
              <input className="searchInput" placeholder="robocop" ref="queryInput" />
            </form>
          </div>
        </div>
        <div className="row">
          {this.renderSearchResult()}
        </div>
      </div>
    )
  }
}
Run Code Online (Sandbox Code Playgroud)

SearchResult 中继容器看起来像这样

class SearchResult extends React.Component {
  render() …
Run Code Online (Sandbox Code Playgroud)

functional-programming relay react-router graphql react-router-relay

13
推荐指数
1
解决办法
232
查看次数

中继:如何在嵌套路由中合并而不是覆盖查询?

我无法导航到/users我的应用程序中,因为它不会触发我想到它应该获取的所有查询.

我的应用程序包含一个App组件和一些包含实际内容的组件,如DashboardUserList.还有一个,EnsureAuthenticationContainer但这只是一个组件,当用户通过身份验证时,只需呈现它的子项.这是我的路线设置:

const ViewerQueries = {
    viewer: () => Relay.QL`query { viewer }`
};
Run Code Online (Sandbox Code Playgroud)

[...]

<Router history={browserHistory} render={applyRouterMiddleware(useRelay.default)} environment={Relay.Store}>
    <Route path="/" component={App} queries={ViewerQueries}>
        <Route path="login" component={Login} />
        <Route component={EnsureAuthenticationContainer}>
            <IndexRoute component={Dashboard} />
            <Route path="users" component={UserList} queries={ViewerQueries} />
            <many more routes />
        </Route>
    </Route>
</Router>
Run Code Online (Sandbox Code Playgroud)

问题是,这两个AppUserList定义fragements,似乎只有的查询UserList被发送.

片段App:

fragments: {
    viewer: () => {
        return Relay.QL`
            fragment on ViewerType {
                loggedInUser {
                    id
                } …
Run Code Online (Sandbox Code Playgroud)

javascript reactjs react-router relayjs react-router-relay

11
推荐指数
1
解决办法
389
查看次数

使用react-router从this.props.children访问React组件

我有一个网站,其中包含以下内容react-routerreact-router-relay设置:

main.jsx:

<Router history={browserHistory} render={applyRouterMiddleware(useRelay)}>
  <Route path="/:classroom_id" component={mainView} queries={ClassroomQueries}>
    <IndexRoute component={Start} queries={ClassroomQueries} />
    <Route path="tasks" component={TaskRoot} queries={ClassroomQueries}>
      <IndexRoute component={TaskList} queries={ClassroomQueries} />
      <Route path="task/:task_id" component={TaskView} queries={ClassroomTaskQueries} />
      <Route path="task/:task_id/edit" component={TaskEdit} queries={ClassroomTaskQueries} />
    </Route>
  </Route>
</Router>
Run Code Online (Sandbox Code Playgroud)

该网站是一个虚拟教室,教师可以在其中为学生创建任务.这些任务也可以编辑.

当用户编辑任务TaskEdit并点击保存时,将应用更改并将用户重定向到TaskList.现在,我希望在编辑任务后为用户提供" 您的更改已保存! "消息.

我已经为此目的创建了一个引导警报组件(<Alert>).

为了便于说明,假设我有以下mainView组件(检查上面的路由器):

mainView.js:

render() {
  <div>
    <Menu />
    <Row>
      <Col md={3}>
        <Sidebar />
      </Col>
      <Col md={9}>
        {this.props.children}  <-- Start, TaskRoot, etc go here
      </Col>
    </Row>
    <Alert someProps={...} /> …
Run Code Online (Sandbox Code Playgroud)

reactjs react-router react-router-relay

7
推荐指数
1
解决办法
671
查看次数

中继/路由器登录变异?

我正在尝试实现登录变异.该变异验证提供的id_token并通过会话记录用户.突变本身有效(用GraphiQL验证),但我遇到了将它与Relay集成的问题.

当用户登录时,整个中继存储可能会被更改,因为"viewer"是根查询.但我不想在胖查询中列出我的整个查询树.能够以某种方式清除整个商店会很好,但我没有看到这样做的方法react-router-relay.

中继突变:

export default class LoginMutation extends Relay.Mutation {
  getMutation() {
    return Relay.QL`mutation {login}`;
  }

  getVariables() {
    return {
      id_token: this.props.id_token
    };
  }

  getFatQuery() {
    // TODO: list everything?
    return Relay.QL`
      fragment on LoginPayload {
        viewer
      }
    `;
  }

  getConfigs() {
    return []; // TODO: not sure what to return...
  }
}
Run Code Online (Sandbox Code Playgroud)

用法:

Relay.Store.commitUpdate(new LoginMutation({id_token}), {
        onSuccess: (resp) => {
          history.push('/');
        }
      });
Run Code Online (Sandbox Code Playgroud)

GraphQL架构:

input LoginInput {
  id_token: String!
  clientMutationId: String!
}

type LoginPayload {
  viewer: Viewer …
Run Code Online (Sandbox Code Playgroud)

react-router graphql relayjs react-router-relay

6
推荐指数
1
解决办法
460
查看次数

如何在中继容器之间传递变量

我正在寻找将父变量中的变量传递给子容器的良好语法.

假设我有这些路线,其上有一个全局小部件列表/和特定的小部件列表/widgets/:WidgetListID.

注意:我使用react-router-relay

<Route
    path='/' component={Layout}
  >
    <IndexRoute
      component={WidgetListContainer}
      queries={ViewerQueries}
    />
    <Route
      path='/widgets/:WidgetListID'
      component={WidgetListContainer}
      queries={ViewerQueries}
    />
  </Route>
Run Code Online (Sandbox Code Playgroud)

它是<WidgetList/><WidgetListContainer/>内部渲染的相同组件,<Layout/>这是我尝试传递WidgetListID变量的方式:

Layout.js

class Layout extends React.Component {
  render() {
    return (
      <div>
       ...
        {children}
       ...
      </div>
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

WidgetListContainer.js

class WidgetListContainer extends React.Component {
  render () {
    return (
      <div>
       ...
        <WidgetList 
          viewer={viewer}
        />
      </div>
    )
  }
}

export default Relay.createContainer(WidgetListContainer, {
  initialVariables: {
    WidgetListID: null
  },
  fragments: {
    viewer: …
Run Code Online (Sandbox Code Playgroud)

react-router relayjs react-router-relay

5
推荐指数
1
解决办法
4382
查看次数