Аполлон-форсированная проблема нумерации страниц с бесконечным повторением данных

Пытаясь закодировать доказательство концепции пагинации с помощью apollo-boost, я получаю данные, повторяющиеся снова и снова, почему это происходит?

Я пробовал с fetchPolicy="cache-and-network" и без нее, но в любом случае он не будет работать должным образом, хотя я пытался следовать примеру документации, не отклоняясь. Я не знаю, что мне не хватает в этом

// mongoose model:
const TodoSchema = new Schema({
  todo: { type: String, required: true }
});

// graphql root query resolver:
pg_todos: {
  type: new GraphQLNonNull(new GraphQLList(new GraphQLNonNull(TodoType))),
  args: {
    page: { type: GraphQLInt },
    limit: { type: GraphQLInt }
  },
  resolve: async (parent, { page, limit }, req) => {
    return await TodoCtrl.getpaginated(page, limit);
  }
}

// top-most HOC
export default class Feed extends Component {
  render() {
    const query_variables = { page: 0 };
    return (
      <div>
        <PostsQuery variables={query_variables}>
          <FeedList />
        </PostsQuery>
      </div>
    );
  }
}

// PostsQuery
const q = gql`
  query pg_todos($page: Int) {
    pg_todos(page: $page) {
      todo
    }
  }
`;

export default class PostsFeedQuery extends Component {
  getVariables() {
    const { variables } = this.props;
    var query_variables = {
      page: 0
    };
    if (typeof variables !== typeof undefined) {
      if (typeof variables.page !== typeof undefined) {
        query_variables.page = variables.page;
      }
    }
    return query_variables;
  }
  render() {
    const { children } = this.props;
    const variables = this.getVariables();

    return (
      <Query query={q} variables={variables} fetchPolicy="cache-and-network">
        {({ loading, error, data, fetchMore }) => {
          if (loading) return <div>Loading...</div>;
          if (error)
            return (
              <div>
                <p>{error.message}</p>
              </div>
            );

          const { pg_todos } = data;

          return React.Children.map(children, function(child) {
            return React.cloneElement(child, { pg_todos, fetchMore });
          });
        }}
      </Query>
    );
  }
}

// FeedList
import InfiniteScroll from "react-infinite-scroller";

export default class FeedList extends Component {
  state = {
    page: 0,
    hasMore: true
  };
  loadMore = fetchMore => {
    const self = this;
    const { page } = this.state;
    fetchMore({
      variables: {
        page: page + 1
      },
      updateQuery(previousResult, { fetchMoreResult }) {
        if (!fetchMoreResult.pg_todos.length) {
          self.setState({ hasMore: false });
          return previousResult.pg_todos; ////////////
        }
        self.setState({ page: page + 1 });
        let rez = Object.assign({}, previousResult, {
          pg_todos: [...previousResult.pg_todos,...fetchMoreResult.pg_todos]
        });
        return rez;
      }
    });
  };
  render() {
    const self = this;
    const { pg_todos, fetchMore } = this.props;
    const { hasMore } = this.state;
    return (
      <div className="feed">
        <InfiniteScroll
          loadMore={() => self.loadMore(fetchMore)}
          hasMore={hasMore}
          loader={
            <div className="loader" key={"loader"}>
              Loading ...
            </div>
          }
        >
          {pg_todos.map((item, i) => {
            return <div key={i}>{item.todo}</div>;
          })}
        </InfiniteScroll>
      </div>
    );
  }
}

0 ответов

Другие вопросы по тегам