包装了apollo-client查询的react组件将自动发起对服务器的数据调用。
我想只在特定的用户输入上发出数据请求。
You can pass the skip option in the query options -但这意味着refetch()函数不是作为组件的道具提供的;而且在道具更新时,似乎不会动态地评估skip的值。
我的用例是map组件。我只想在用户按下按钮时加载标记的数据,而不是在初始组件安装或位置更改时加载。
下面是一个代码示例:
// GraphQL wrapping
Explore = graphql(RoutesWithinQuery, {
options: ({ displayedMapRegion }) => ({
variables: {
scope: 'WITHIN',
targetRegion: mapRegionToGeoRegionInputType(displayedMapRegion)
},
skip: ({ targetResource, searchIsAllowedForMapArea }) => {
const skip = Boolean(!searchIsAllowedForMapArea || targetResource != 'ROUTE');
return skip;
},
}),
props: ({ ownProps, data: { loading, viewer, refetch }}) => ({
routes: viewer && viewer.routes ? viewer.routes : [],
refetch,
loading
})
})(Explore);发布于 2017-08-24 07:38:14
要包含基于受属性更改影响的条件的HoC,您可以使用recompose中的branch。
branch(
test: (props: Object) => boolean,
left: HigherOrderComponent,
right: ?HigherOrderComponent
): HigherOrderComponent查看:https://github.com/acdlite/recompose/blob/master/docs/API.md#branch
对于此特定示例,将如下所示:
const enhance = compose(
branch(
// evaluate condition
({ targetResource, searchIsAllowedForMapArea }) =>
Boolean(!searchIsAllowedForMapArea || targetResource != 'ROUTE'),
// HoC if condition is true
graphql(RoutesWithinQuery, {
options: ({ displayedMapRegion }) => ({
variables: {
scope: 'WITHIN',
targetRegion: mapRegionToGeoRegionInputType(displayedMapRegion)
},
}),
props: ({ ownProps, data: { loading, viewer, refetch } }) => ({
routes: viewer && viewer.routes ? viewer.routes : [],
refetch,
loading
})
})
)
);
Explore = enhance(Explore);发布于 2017-11-19 18:45:12
我有一个类似的用例,我想只在用户单击时加载数据。
对于by pencilcheck above,我没有尝试过withQuery的建议。但我在其他地方也看到了同样的建议。我将尝试它,但在此期间,这就是我如何让它工作的based off a discussion on github
./loadQuery.js
注意:我使用的是跳过指令:
const LOAD = `
query Load($ids:[String], $skip: Boolean = false) {
things(ids: $ids) @skip(if: $skip) {
title
}
`LoadMoreButtonWithQuery.js
在这里,我使用withState高阶函数添加一个标志和一个标志设置器来控制skip
import { graphql, compose } from 'react-apollo';
import { withState } from 'recompose';
import LoadMoreButton from './LoadMoreButton';
import LOAD from './loadQuery';
export default compose(
withState('isSkipRequest', 'setSkipRequest', true),
graphql(
gql(LOAD),
{
name: 'handleLoad',
options: ({ids, isSkipRequest}) => ({
variables: {
ids,
skip: isSkipRequest
},
})
}
),
)(Button);./LoadMoreButton.js
在这里,我必须手动“翻转”使用withState添加的标志
export default props => (
<Button onClick={
() => {
props.setSkipRequest(false); // setter added by withState
props.handleLoad.refetch();
}
}>+</Button>
);坦率地说,我对此有点不满意,因为它引入了一组新的连接(由“withState”组成)。它也没有经过实战测试--我只是让它正常工作,我来StackOverflow是为了寻找更好的解决方案。
https://stackoverflow.com/questions/40296800
复制相似问题