Принудительная повторная выборка в Relay Modern RefetchContainer без (новых) переменных

Я пытаюсь выяснить, как / можно ли запустить обновление в Relay Modern RefreshContainer без передачи (новых) переменных?

Я ищу лучший способ реализовать старый добрый "pull-to-refresh" список React Native, который должен просто обновлять исходный запрос - переменные не нужны?

Согласно документам (https://facebook.github.io/relay/docs/api-cheatsheet.html) это должно быть возможно с помощью

this.props.relay.refetch({}, callback, {force: true})

но я получаю сообщение об ошибке «undefined не является объектом ('оценка taggedNode.modern')»

введите здесь описание изображения

Запрос работает нормально, если я использую вместо него простой старый FragmentContainer, но мне просто нужна простая функциональность оттягивания для обновления :-)

РЕДАКТИРОВАТЬ Добавляем дополнительный код для ясности. Также обновлен вызов, чтобы отразить изменения в API, который включает переменные рендеринга, передавая null

class HistoryList extends React.PureComponent<void, Props, State> {
  state = { refreshing: false };

  _renderRow = ({ item }) => {
    return <HistoryListItem item={item.node} />;
  };

  _renderHeader = ({ section }) => {
    return (
      <Text style={[cs.breadText, _styles.sectionHeader]}>
        {section.title}
      </Text>
    );
  };

  _onRefresh = () => {
    this.setState({ refreshing: true });
    this.props.relay.refetch({}, null, this._onRefreshDone(), { force: true });
  };

  _onRefreshDone = () => {
    this.setState({ refreshing: false });
  };

  _sortDataIntoSections = (edges: Array<Node>) => {
    return _.chain(edges)
      .groupBy(element => {
        return moment(element.node.huntDate).format('MMMM YYYY');
      })
      .map((data, key) => {
        return { title: key, data: data };
      })
      .value();
  };

  render() {
    return (
      <View style={_styles.container}>
        <SectionList
          renderSectionHeader={this._renderHeader}
          sections={this._sortDataIntoSections(
            this.props.entries.allJournalEntries.edges
          )}
          renderItem={this._renderRow}
          keyExtractor={(item, index) => item.node.__id}
          onRefresh={this._onRefresh}
          refreshing={this.state.refreshing}
        />
      </View>
    );
  }
}

export default createRefetchContainer(
  HistoryList,
  graphql`
    fragment HistoryList_entries on Viewer {
      allJournalEntries(orderBy: huntDate_DESC) {
        count
        edges {
          node {
            huntDate
            ...HistoryListItem_item
          }
        }
      }
    }
  `
);

person jhm    schedule 27.07.2017    source источник


Ответы (2)


Похоже, что аргументы this.props.relay.refetch были изменены на refetch(refetchVariables, renderVariables, callback, options)https://facebook.github.io/relay/docs/refetch-container.html), а таблица устарела.

Я не уверен, в какой версии это изменение, но вы можете попробовать и изменить свой код на:

this.props.relay.refetch({}, null, callback, {force: true})
person zetavg    schedule 01.08.2017
comment
Ты прав! Но, к сожалению, тоже не работает: - / - person jhm; 03.08.2017

Решение было найдено robrichard на github.

Мне не хватало третьего аргумента для RefetchContainer, который является запросом для выполнения при повторной выборке. Это, в сочетании с предложением @zetavg, было тем, что было необходимо.

Экспортированный модуль теперь выглядит так:

export default createRefetchContainer(
  HistoryList,
  {
    entries: graphql`
      fragment HistoryList_entries on Viewer {
        allJournalEntries(orderBy: huntDate_DESC) {
          count
          edges {
            node {
              huntDate
              ...HistoryListItem_item
            }
          }
        }
      }
    `
  },
  graphql`
    query HistoryListRefetchQuery {
      viewer {
        ...HistoryList_entries
      }
    }
  `
);
person jhm    schedule 03.08.2017