我在寫一個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'字段。謝謝! –