Как обновить состояние после завершения запроса? - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть страница, которая при загрузке отображает пару входных данных для поиска и список участников. Когда пользователь обновляет поле, запрос перезапускается, и список участников обновляется на основе этого ввода. Моя проблема пытается интегрировать нумерацию страниц.

Я пытаюсь использовать модуль Reaction-infinite-scroll-component. https://www.npmjs.com/package/react-infinite-scroll-component. И я пытаюсь следовать примеру здесь -> https://codesandbox.io/s/yk7637p62z?file= / src / index. js: 855-998

Я догадываюсь, что мне нужно обновить исходное состояние с помощью мой список участников. Как я могу это сделать? Я думал, что onCompleted может сработать, но не смог заставить его принять.

import React, { Component } from "react";
import { Query } from "react-apollo";
import gql from "graphql-tag";
import styled from "styled-components";
import InfiniteScroll from "react-infinite-scroll-component";
import { SearchStyles } from "./styles/DropDown";
import Divider from "../components/styles/Divider";
import Member from "./Member";
import Form from "./styles/Form";

const SEARCH_BASIC_QUERY = gql`
  query SEARCH_BASIC_QUERY($iam: String, $ageLow: Int) {
    members(where: { iam_starts_with: $iam, ageLow_lte: $ageLow }) {
      id
      firstName
      image1
      iam
      ageLow
    }
  }
`;

const MembersList = styled.div`
  display: grid;
  grid-template-columns: 1fr 1fr;
  grid-gap: 60px;
  margin: 0 auto;
  max-width: ${props => props.theme.maxWidth};
`;

const FormSectionWrap = styled.div`
  display: grid;
  grid-template-columns: repeat(12, 1fr);
  grid-gap: 0px;
  margin-bottom: 72px;
`;

const FormSectionTitle = styled.div`
  grid-column: 1 / 5;
  h4 {
    margin-bottom: 16px;
    margin-top: 0;
    color: ${props => props.theme.grey1};
    font-size: 400;
    font-weight: 600;
  }
  div {
    margin: 0;
  }
  p {
    color: ${props => props.theme.grey4};
  }
`;

const FormSectionFields = styled.div`
  grid-column: 6 / 11;
`;

class BasicSearch extends Component {
  state = {
    // members: Array.from({ length: 4 }),
    members: [],
    items: Array.from({ length: 20 })
  };

  handleChange = e => {
    const { name, type, value } = e.target;
    const val = type === "number" ? parseFloat(value) : value;

    this.setState({ [name]: val });
  };

  fetchMoreData = () => {
    // a fake async api call like which sends
    // 20 more records in 1.5 secs
    setTimeout(() => {
      this.setState({
        items: data.members.concat(Array.from({ length: 20 }))
      });
    }, 1500);
  };

  render() {
    return (
      <SearchStyles>
        <Form>
          <fieldset>
            <FormSectionWrap>
              <FormSectionTitle>
                <h4>Basic Search</h4>
                <Divider></Divider>
                <p>
                  Quam porttitor aenean suspendisse duis neque, ullamcorper
                  pulvinar id feugiat pulvinar duis
                </p>
              </FormSectionTitle>
              <FormSectionFields>
                <label htmlFor="iam">
                  Seeking A
                  <select
                    type="text"
                    id="iam"
                    name="iam"
                    placeholder=""
                    onChange={this.handleChange}
                  >
                    <option selected disabled hidden value="">
                      ---
                    </option>
                    <option>Female</option>
                    <option>Male</option>
                  </select>
                </label>

                <label htmlFor="ageLow">
                  Between ages
                  <select
                    type="number"
                    id="ageLow"
                    name="ageLow"
                    placeholder=""
                    onChange={this.handleChange}
                  >
                    <option selected disabled hidden value="">
                      ---
                    </option>
                    <option>18</option>
                    <option>25</option>
                    <option>35</option>
                    <option>45</option>
                    <option>55</option>
                    <option>65</option>
                  </select>
                </label>
              </FormSectionFields>
            </FormSectionWrap>
          </fieldset>
        </Form>

        <Query
          query={SEARCH_BASIC_QUERY}
          variables={{
            ...this.state
          }}
        >
          {({ data, loading }) => {
            if (loading) return <p>Loading...</p>;

            if (!data.members.length)
              return (
                <p>
                  No Members Yet! Do a search above. *Note* We should build out
                  this empty state. Opportunity to show some personality.
                </p>
              );

            return (
              <div>
                <InfiniteScroll
                  dataLength={this.state.items.length} //This is important field to render the next data
                  next={this.fetchMoreData}
                  hasMore={true}
                  loader={<h4>Loading...</h4>}
                  endMessage={
                    <p style={{ textAlign: "center" }}>
                      <b>Yay! You have seen it all</b>
                    </p>
                  }
                >
                  {/* Renders list of members */}
                  {data.members.map(member => (
                    <Member member={member} key={member.id}></Member>
                  ))}
                  }{/* Code from infinite scroll example */}
                  {this.state.items.map((i, index) => (
                    <div key={index}>div - #{index}</div>
                  ))}
                </InfiniteScroll>

                <MembersList>
                  {/* {data.members.map(member => (
                    <Member member={member} key={member.id}></Member>
                  ))} */}
                </MembersList>
              </div>
            );
          }}
        </Query>
      </SearchStyles>
    );
  }
}

export default BasicSearch;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...