facebook / facebook/relay

createRefetchContainer does not update props

Open
#4,181 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
Rust
Stars
19k
Forks
1.9k
PR merge metrics
No merged PRs in 30d

Description

I have code like:

```import React, { Component } from 'react';
import { graphql } from 'react-relay';
import Foo from '../Foo';
import enviroment from '../enviroment';

const schemaQuery = graphql`query FooBetterQuery($filter: Filter, $pageInfo: PageInfo) {
foo(filter: $filter, pageInfo: $pageInfo) {
...Foo_foo @arguments(filter: $filter, pageInfo: $pageInfo)
}
}`;

export default class FooBetter extends Component {
renderQuery = ({ props, error }) => (

);

getVariables = () => ({
pageInfo: {
offset: 0,
count: 10,
},
})

render() {
return (

);
}
}
```

and for `Foo`:

```
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { DataGrid } from '@mui/x-data-grid';
import { createRefetchContainer, graphql } from 'react-relay';


export class Foo extends Component {
constructor(props) {
super(props);
this.state = {
isLoading: true,
data: [],
total: 0,
page: 1,
pageSize: 10,
};
}

componentDidUpdate(prevProps, prevState) {
const { foo } = this.props;
if (prevState.data !== foo.items
) {
this.setState((old) => ({
pageState: {
...old.pageState, isLoading: false, data: foo.items, total: 200,
},
}));
}
}

_loadMore(page) {
// Increments the number of stories being rendered by 10.
const { relay } = this.props;
const refetchVariables = () => ({
pageInfo: {
offset: (page - 1) * 10,
count: 10,
},
});
this.setState((old) => ({ pageState: { ...old.pageState, isLoading: true } }));
relay.refetch(refetchVariables, null, null, { force: true });
}

render() {
const { data } = this.state;
return (
{
this._loadMore(newPage + 1);
this.setState((old) => ({ pageState: { ...old.pageState, page: newPage + 1 } }));
}}
/>
);
}
}

Foo.propTypes = {
foo: PropTypes.object,
relay: PropTypes.object,
};

Foo.defaultProps = {
foo: {},
relay: {},
};

const schemaQuery = graphql`query FooQuery($filter: Filter, $pageInfo: PageInfo) {
foo(filter: $filter, pageInfo: $pageInfo) {
...Foo_foo @arguments(filter: $filter, pageInfo: $pageInfo)
}
}`;

export default createRefetchContainer(Foo,
{
foo: graphql`fragment Foo_foo on FooList
@argumentDefinitions(
filter: {type: "Filter"}
pageInfo: {type: "PageInfo"}
) {
items {
name
},
page {
offset
nextOffset
hasNextPage
}
}`,
},
schemaQuery);
```

When in `DataGrid` I click on the next page in DevTools I see correct request and response, but data in props does not change. What is the reason?

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.