Мутация Apollo Graphql и запросы повторной выборки, возвращающие пустые данные

В настоящее время мы работаем над приложением, в котором у нас есть список контактов с идентификатором и именем списка. При нажатии на имя списка контактов открывается подробная страница, на которой перечислены все контакты в указанном списке контактов.

На этой странице установлена ​​кнопка для отображения полей ввода для добавления дополнительных контактов. Затем эти контакты добавляются с помощью мутаций.

После завершения мутации компонент подробных сведений списка контактов не удалось отобразить, что привело к ошибке undefined (для операторов карты), однако обновление страницы ясно показывает, что контакт успешно добавлен. Вот фрагменты кода:

Компонент ManageContact, доступ через / contacts / manage /: id route

....

class ManageContact extends Component {
  state = {
    showAddForm: false
  };

  handleAddContactBtn = () => {
    this.setState({ showAddForm: !this.state.showAddForm });
  };

  render() {
    const { showAddForm } = this.state;

    return (
      <Query
        query = {findContactList}
        variables = {{ id: this.props.match.params.id }}
      >
        {({ loading, error, data:{findContactList} }) => {
          if (loading) return "loading";
          if (error) return "error";
          console.info(findContactList)
          const renderContacts = findContactList => {
            const { contacts } = findContactList;
            return contacts.map((contact, index) => {
              return (
                <Row key = {contact._id}>
                  <Col s = {3}>{contact.firstName}</Col>
                  <Col s = {3}>{contact.lastName}</Col>
                  <Col s = {3}>{contact.email}</Col>
                  <Col s = {3}>
                    <Button>
                      <Icon>edit</Icon>
                    </Button>
                    <Button>
                      <Icon>delete_forever</Icon>
                    </Button>
                  </Col>
                </Row>
              );
            });
          };
          return (
            <Fragment>
              <h3>{findContactList.listName}</h3>
              <Row>
                <Button onClick = {this.handleAddContactBtn} className = "right">
                  <Icon>{showAddForm ? "close" : "person_add"}</Icon>
                </Button>
              </Row>
              {renderContacts(findContactList)}
              {showAddForm ? (
                <RecipientList contactListID = {findContactList._id} onFinishCreateContact = {() => this.handleAddContactBtn()}/>
              ) : null}
            </Fragment>
          );
        }}
      </Query>
    );
  }
}

export default ManageContact;

А вот компонент RecipientList, в котором выполняется мутация для добавления контактов:

...
import {
  createContactMutation,
  findContactList,
  userContactListQuery
} from "../../../graphql";

class RecipientList extends Component {
  state = {
    firstName: "",
    lastName: "",
    email: ""
  };

  createContact = async () => {
    const {
      createContactMutation,
      contactListID,
      onFinishCreateContact
    } = this.props;
    const { firstName, lastName, email } = this.state;
    onFinishCreateContact()
    try {
      await createContactMutation({
        variables: {
          contactListID,
          firstName,
          lastName,
          email
        },
        refetchQueries: [
          { query: userContactListQuery },
          { query: findContactList, variables:{ id: contactListID }}
        ]
      });


    } catch (err) {
      console.info(err);
    }

  };

  handleInputChange = e => {
    this.setState({ [e.target.name]: e.target.value });
  };

  renderRecipientAddForm = () => {
    const { firstName, lastName, email } = this.state;
    return (
      <Row>
        <Col s = {3}>
          <Input
            label = "First Name"
            name = "firstName"
            value = {`${firstName}`}
            onChange = {this.handleInputChange}
          />
        </Col>
        <Col s = {3}>
          <Input
            label = "Last Name"
            name = "lastName"
            value = {`${lastName}`}
            onChange = {this.handleInputChange}
          />
        </Col>
        <Col s = {3}>
          <Input
            label = "Email"
            name = "email"
            value = {`${email}`}
            onChange = {this.handleInputChange}
          />
        </Col>
        <Col s = {3}>
          <Button onClick = {this.createContact}>+</Button>
        </Col>
      </Row>
    );
  };

  render() {
    return <span>{this.renderRecipientAddForm()}</span>;
  }
}

export default graphql(createContactMutation, {
  name: "createContactMutation"
})(RecipientList);

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

Есть идеи о том, что я сделал не так?

Не могли бы вы опубликовать получаемые сообщения об ошибках?

Tal Z 15.04.2018 11:29

Я думаю, что нашел ошибку, я не вернул _id ни по одному из запросов. Как только я добавил возвращенный _id, теперь он работает :)

scubadude 16.04.2018 07:41

@scubadude, если вы действительно нашли решение, опубликуйте его в качестве ответа.

Daniel 27.12.2018 01:22
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
3
888
0

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