13

我是 Relay 的新手,仍在努力解决它。根据我的理解,Relay 将查询与组件联系起来。这样,您可以说需要从 GraphQL 服务器提供组件 x、y 和 z。根据我的理解,官方react-relay库将在适当的时间发送这些查询,很可能是在组件即将被渲染的时候。

这一切对我来说都是直接的用例,例如简单地显示数据列表。

但是,我对如何做感到困惑的是,如何调度可能不完全属于与组件相关联的事物类别的查询。一种查询,例如尝试获取用户身份验证会话令牌或其他内容的查询。这是我目前的情况:我正在尝试创建一个从 GraphQL 获取会话令牌的用户登录表单。我有一个参数化的 GraphQL 字段,它需要用户名和密码参数,如果它们有效,将返回一个会话令牌。我只是不知道如何使用 Relay 来查询该会话令牌。

我基本上只需要发送一个查询并处理响应(将该会话令牌放入 React 应用程序状态)。

有任何想法吗?

4

2 回答 2

20

Relay 的 API 主要专注于使获取组件数据变得容易,但 Relay 也支持 ad-hoc 查询。API 相对较低级,具有用于获取和读取数据的不同功能。以下是如何获取临时查询和访问响应的示例:

// Create a query with values for any variables:
var query = Relay.createQuery(Relay.QL`query ... `, {var: 'value'});
// Fetch any fields that have not yet been cached:
Relay.Store.primeCache({query}, readyState => {
  if (readyState.done) {
    // When all data is ready, read the data from the cache:
    var data = Relay.Store.readQuery(query)[0];
    /* access fields on `data` */
  }
});

如果数据不需要与 Relay 的缓存同步,您还可以使用纯网络请求(XHR、fetch 等)将纯字符串查询发送到您的 GraphQL 端点。

于 2015-12-21T22:52:06.713 回答
1

老实说,使用单独的库可能是最简单的。我Lokka在我的node项目中使用它,它非常简单且可靠。

// config
const Lokka = require('lokka').Lokka;
const Transport = require('lokka-transport-http').Transport;

const client = new Lokka({
  transport: new Transport('http://graphql-swapi.parseapp.com/')
});



// query
client.query(`
  {
    allFilms {
      films {
        ...${filmInfo}
      }
    }
  }
`).then(result => {
  console.log(result.allFilms.films);
});
于 2017-01-24T22:15:14.157 回答