Relay-Modern FragmentContainer 数据未填充
Relay-Modern FragmentContainer data not populated
我正在使用 Relay Modern 尝试将数据加载到 FragmentContainer
。我正在使用熟悉的 Container (Smart) / Presenter (Dumb) 模式,并且数据没有按预期传递到我的子 Container 中。但是,如果我使用 Relay 的 @relay(mask: false)
指令来查看 QueryRenderer
是否正确加载了片段数据, 片段数据就在那里 .
我不明白为什么数据没有发送到我的容器。非常感谢任何帮助。
ScreenContainer.js
(呈现 QueryRenderer
):
/* ScreenContainer.js */
import ScreenPresenter from './ScreenPreseenter';
const query = graphql`
query ScreenContainerQuery($id: ID!) {
viewer {
User(id: $id) {
id
...NestedFragmentContainer_user
}
}
}`
export default class ScreenContainer extends Component {
render() {
<QueryRenderer
query={query}
variables={{id: id}}
render={() => <ScreenPresenter />}
/>
}
}
ScreenPresenter.js
:
/* ScreenPresenter.js */
import NestedFragmentContainer from './NestedFragment';
export default class ScreenPresenter extends Component {
render() {
return <NestedFragmentContainer />
}
}
最后,NestedFragmentContainer.js
:
/* ./NestedFragmentContainer.js */
class NestedFragmentContainer extends Component {
render() {
const { user } = this.props;
console.log(user); // <-- Always null, not undefined
return <Text>{user.account.name}</Text>;
}
}
export default createFragmentContainer(
NestedFragmentContainer,
graphql`
fragment NestedFragmentContainer_user on User {
account {
name
}
}
`
此外,每当 NestedFragmentContainer
渲染时,我都会看到一个错误,它的 user
属性是 undefined
。但是,console.log()
表明它的值实际上是 null
,而不是 undefined
。
Warning: createFragmentContainerSpecResolver: Expected prop `user`
to be supplied to Relay(NestedFragmentContainer)`, but got
`undefined`. Pass an explicit `null` if this is intentional.
有谁知道为什么 FragmentContainer 没有使用其数据呈现?
您应该检查 QueryRenderer 组件中的渲染函数是否确实有数据到来或有错误。然后,如果数据在那里,你必须通过道具传递给用户。我没怎么用过 Relay,希望对你有帮助
假设查询成功,数据需要传递给呈现的组件。正如 Relay 现代文档中所述:
QueryRenderer is the root of a Relay tree. It takes a query, fetches the data and calls the render callback with the data.
在您的情况下,queryRenderer
应如下所示:
render() {
return (
<QueryRenderer
environment={environment}
query={query}
variables={{id: id}}
render={({error, props}) => {
if (error) {
return <div>{error.message}</div>
} else if (props) {
/* Here is the crucial part */
return < ScreenPresenter data={props.viewer} />
}
return <div>Loading</div>
}}
/>
)
}
}
然后您就可以将 props 从容器组件(智能)传递到展示组件(愚蠢)。
我正在使用 Relay Modern 尝试将数据加载到 FragmentContainer
。我正在使用熟悉的 Container (Smart) / Presenter (Dumb) 模式,并且数据没有按预期传递到我的子 Container 中。但是,如果我使用 Relay 的 @relay(mask: false)
指令来查看 QueryRenderer
是否正确加载了片段数据, 片段数据就在那里 .
我不明白为什么数据没有发送到我的容器。非常感谢任何帮助。
ScreenContainer.js
(呈现 QueryRenderer
):
/* ScreenContainer.js */
import ScreenPresenter from './ScreenPreseenter';
const query = graphql`
query ScreenContainerQuery($id: ID!) {
viewer {
User(id: $id) {
id
...NestedFragmentContainer_user
}
}
}`
export default class ScreenContainer extends Component {
render() {
<QueryRenderer
query={query}
variables={{id: id}}
render={() => <ScreenPresenter />}
/>
}
}
ScreenPresenter.js
:
/* ScreenPresenter.js */
import NestedFragmentContainer from './NestedFragment';
export default class ScreenPresenter extends Component {
render() {
return <NestedFragmentContainer />
}
}
最后,NestedFragmentContainer.js
:
/* ./NestedFragmentContainer.js */
class NestedFragmentContainer extends Component {
render() {
const { user } = this.props;
console.log(user); // <-- Always null, not undefined
return <Text>{user.account.name}</Text>;
}
}
export default createFragmentContainer(
NestedFragmentContainer,
graphql`
fragment NestedFragmentContainer_user on User {
account {
name
}
}
`
此外,每当 NestedFragmentContainer
渲染时,我都会看到一个错误,它的 user
属性是 undefined
。但是,console.log()
表明它的值实际上是 null
,而不是 undefined
。
Warning: createFragmentContainerSpecResolver: Expected prop `user`
to be supplied to Relay(NestedFragmentContainer)`, but got
`undefined`. Pass an explicit `null` if this is intentional.
有谁知道为什么 FragmentContainer 没有使用其数据呈现?
您应该检查 QueryRenderer 组件中的渲染函数是否确实有数据到来或有错误。然后,如果数据在那里,你必须通过道具传递给用户。我没怎么用过 Relay,希望对你有帮助
假设查询成功,数据需要传递给呈现的组件。正如 Relay 现代文档中所述:
QueryRenderer is the root of a Relay tree. It takes a query, fetches the data and calls the render callback with the data.
在您的情况下,queryRenderer
应如下所示:
render() {
return (
<QueryRenderer
environment={environment}
query={query}
variables={{id: id}}
render={({error, props}) => {
if (error) {
return <div>{error.message}</div>
} else if (props) {
/* Here is the crucial part */
return < ScreenPresenter data={props.viewer} />
}
return <div>Loading</div>
}}
/>
)
}
}
然后您就可以将 props 从容器组件(智能)传递到展示组件(愚蠢)。