我在写一个relay.js应用程序,并且我正在使用react-relay-router进行路由。路由工作,但我相信这暴露了我对如何在不同视图中组织查询片段的误解。在定义用RelayRouter导航relay.js应用程序抛出无效状态更改错误
路由app.js在DataModelList.js
const rootComponent =
(<RelayRouter history={hashHistory}>
<Route path="/"
component={App}
queries={ViewerQueries}
onReadyStateChange={this.handleStateChange}
>
<IndexRoute
component={Dashboard}
queries={ViewerQueries}
/>
<Route
path="/org_setup"
component={OrgSetup}
queries={ViewerQueries}
/>
<Route
path="/admin/data_models"
component={DataModelList}
queries={ViewerQueries}
/>
</Route>
</RelayRouter>);
ReactDOM.render(rootComponent, mountNode);
查询片段声明
export default Relay.createContainer(DataModelList, {
fragments: {
viewer:() => Relay.QL`
fragment on User {
dataModels(first: 10) {
edges {
node {
id,
name,
isAuthority,
categories(first: 10) {
edges {
node {
id,
name,
tags(first: 10) {
edges {
node {
id,
code,
label,
}
}
}
}
}
},
adapter {
categories(first: 10) {
edges {
node {
id,
name,
}
}
}
}
}
}
},
}
`,
},
});
在OrgSetup.js
export default Relay.createContainer(OrgSetup, {
fragments: {
viewer:() => Relay.QL`
fragment on User {
dataModels(first: 10) {
edges {
node {
id,
name,
isAuthority,
categories(first: 10) {
edges {
node {
id,
name,
tags(first: 10) {
edges {
node {
id,
code,
label,
}
}
}
}
}
},
}
}
},
}
`,
},
});
查询片段
当DataModelList
和OrgSetup
间导航(在任一方向)我看到以下错误在控制台:
Server request for query `ViewerQueries` failed for the following reasons:
1. Cannot query field "node" on "Query".
rQueries($id_0:ID!){node(id:$id_0){id,__typename,...F0}} fra
Warning: RelayReadyState: Invalid state change from
{"aborted":false,"done":false,"error":{"source":{"data":null,"errors":
[{"message":"Cannot query field \"node\" on \"Query\".","locations":
[{"line":1,"column":32}]}]}},"ready":false,"stale":false}` to `{"error":
{"source":{"data":null,"errors":[{"message":"Cannot query field \"node\" on
\"Query\".","locations":[{"line":1,"column":32}]}]}}}`.warning @
app.js:31567update @ app.js:39409onRejected @ app.js:39035tryCallOne @
app.js:30045(anonymous function) @ app.js:30131flush @ app.js:30279
我能够防止此错误由两个视图中相同使得查询片段发生 - 具体是通过添加adapter
片段。
但是,这感觉不对。他们不需要是完全相同的(事实上,由于这是一个学习应用程序,因此目前有些人故意臃肿),其他视图当然不会共享这些数据需求。
- 保持查询声明简洁的最佳做法是什么? 理想情况下,我会顶级视图只声明顶级数据 要求。具体而言,在我的例子视图文件,我会要求 只有
viewer
及其dataModels
,然后让孩子 组件来表达自己的需求,要求任何嵌套的数据(例如categories
,tags
,或adapters
及其各自categories
)。 invalid state change
错误的真正含义是什么?我可以看到 它满足的查询完全匹配,但我不能 想象无关的意见是共享查询声明所必需的。我怀疑这是我在其他地方做错事的副产品。
谢谢!
关于'无效状态change'错误:它看起来像一个第2状态变化是越来越冲入没有合适的状态变化特性(中止,完成,等等)。我想知道那些来自哪里。如果你有时间,使继电器游乐场一个摄制情况下,我们很乐意到现场问题或拉请求。 https://github.com/facebook/relay/blob/master/src/store/RelayReadyState.js#L57-L67 – steveluscher
@steveluscher这个错误已经消失,现在,我有1)包括用于解决一个'adapter'逻辑在'nodeInterface'和2)设置在根查询'node'字段。谢谢! –