React-relay 在片段上无效使用 @refetchable
我正在学习react-relay(v13),并且在使用@refetchable指定分页片段时遇到问题。这是一个非常基本的结构,如果不使用@refetchable,一切正常(即我可以查询grapql服务器,获取数据,使用Fragment渲染相同的查询/片段而不分页)
当我在ProjectsFragment_user中引入@refetchable时,react-relay编译器给出错误:
[ERROR] ✖︎ Invalid use of @refetchable on fragment 'ProjectsFragment_user', only supported are fragments on:
- the Viewer type
- the Query type
- the Node interface or types implementing the Node interface
- @fetchable type
现在这很令人困惑,因为 ProjectsFragment_user 的查询如下所示:
// Dashboard.js
export const dashboardQuery = graphql`
query DashboardQuery ($id: ID) {
user (id: $id){
id
name
...ProjectsFragment_user
}
}
`;
// then
const data = useLazyLoadQuery(dashboardQuery, {}, {},);
//Projects.js defines fragment
const {data, loadNext} = usePaginationFragment(graphql`
fragment ProjectsFragment_user on User
@argumentDefinitions(
first: {type: "Int", defaultValue: 10}
after: {type: "String"}
before: {type: "String"}
)
@refetchable(queryName: "ProjectsListPaginationQuery")
{
projects (first: $first, after: $after, before: $before)
@connection(key: "ProjectsList_projects") {
total
edges {
node {
id
name
members {
total
edges {
node {
member_id
member {
name
}
role
}
}
}
}
}
}
}
`,
props?.projects);
注意,如果只是在 ProjectsFragment_user 上使用 useFragment 并删除 @refetchable I可以获取和渲染数据。
有谁知道为什么这里不允许 @refetchable 吗?
I am learning react-relay (v13) and have a problem specifying a pagination fragment with @refetchable. It is a very basic structure and everything works if @refetchable is not used (ie I can query grapql server, obtain data, useFragment to render same query/fragment without pagination)
When I introduce @refetchable in the ProjectsFragment_user the react-relay compiler gives error:
[ERROR] ✖︎ Invalid use of @refetchable on fragment 'ProjectsFragment_user', only supported are fragments on:
- the Viewer type
- the Query type
- the Node interface or types implementing the Node interface
- @fetchable type
Now this is confusing as ProjectsFragment_user is on a query that looks like this:
// Dashboard.js
export const dashboardQuery = graphql`
query DashboardQuery ($id: ID) {
user (id: $id){
id
name
...ProjectsFragment_user
}
}
`;
// then
const data = useLazyLoadQuery(dashboardQuery, {}, {},);
//Projects.js defines fragment
const {data, loadNext} = usePaginationFragment(graphql`
fragment ProjectsFragment_user on User
@argumentDefinitions(
first: {type: "Int", defaultValue: 10}
after: {type: "String"}
before: {type: "String"}
)
@refetchable(queryName: "ProjectsListPaginationQuery")
{
projects (first: $first, after: $after, before: $before)
@connection(key: "ProjectsList_projects") {
total
edges {
node {
id
name
members {
total
edges {
node {
member_id
member {
name
}
role
}
}
}
}
}
}
}
`,
props?.projects);
Note, if just useFragment on ProjectsFragment_user and remove @refetchable I can fetch and render data.
Does anyone have any clues why @refetchable is not allowed here??
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
并回答我自己的问题(经过几天的努力弄清楚)。 Schema 需要具体说明 Type 正在扩展 Node 接口,否则 React 会按照上面的方式进行抱怨。
因此,我将项目从 cnahged
到
,React-Relay 现在将进行编译。我希望中继错误消息更清晰一些,因为有太多的事情可能会出错,而且中继对事情很有主见,更好的错误消息将会有很大的帮助。
And to answer my own question (after days of trying to figure it out). The Schema needs to be specific that Type is extending Node interface otherwise react will complain as per above.
So, I cnahged Project from
to
and React-Relay will compile now. I wish relay error messages are a bit clearer as there are sooo many things that can go wrong and as relay is pretty opinionated about things better error messages would be a great help.