Я собираю список данных с graphql HOC, предоставляемый реагировать на apollo. Например:.
const fetchList = graphql(
  dataListQuery, {
    options: ({ listId }) => ({
      variables: {
        listId,
      },
    }),
    props: ({ data: { loading, dataList } }) => {
      return {
        loading,
        list: dataList,
      };
    }
  }
);
Я показываю список в управляемой группе переключателей, и мне нужно выбрать один из элементов по умолчанию. Элемент id выбранного элемента хранится в хранилище Redux.
Итак, вопрос в том, как обновить хранилище Redux (т.е. установить selectedItem) после успешного завершения запроса?
Некоторые варианты, которые пришли мне на ум:
Вариант 1
Должен ли я слушать действия APOLLO_QUERY_RESULT в моем редукторе Redux? Но это неловко, потому что тогда мне нужно будет слушать как APOLLO_QUERY_RESULT, так и APOLLO_QUERY_RESULT_CLIENT, если запрос уже выполнялся раньше. А также operationName prop присутствует только в действии APOLLO_QUERY_RESULT, а не в действии APOLLO_QUERY_RESULT_CLIENT. Поэтому мне нужно было бы проанализировать каждое действие APOLLO_QUERY_RESULT_CLIENT, чтобы знать, откуда оно взялось. Не существует ли простой и прямой способ идентифицировать действия с результатами запроса?
Вариант 2
Мне нужно отправить отдельное действие вроде SELECT_LIST_ITEM в componentWillReceiveProps например (используя recompose):
const enhance = compose(
  connect(
    function mapStateToProps(state) {
      return {
        selectedItem: getSelectedItem(state),
      };
    }, {
      selectItem, // action creator
    }
  ),
  graphql(
    dataListQuery, {
      options: ({ listId }) => ({
        variables: {
          listId,
        },
      }),
      props: ({ data: { loading, dataList } }) => ({
        loading,
        items: dataList,
      }),
    }
  ),
  lifecycle({
    componentWillReceiveProps(nextProps) {
      const {
        loading,
        items,
        selectedItem,
        selectItem,
      } = nextProps;
      if (!selectedItem && !loading && items && items.length) {
        selectItem(items[items.length - 1].id);
      }
    }
  })
);
Вариант 3
Должен ли я использовать клиента Apollo напрямую, введя его с помощью withApollo, а затем отправьте мое действие с помощью client.query(...).then(result => { /* some logic */ selectItem(...)}). Но тогда я потеряю все преимущества интеграции "реакция-аполлон", поэтому на самом деле не вариант.
Вариант 4
Должен ли я вообще не обновлять хранилище Redux после возвращения запроса? Потому что я мог бы просто реализовать селектор, который возвращает selectedItem, если он установлен, и если он не пытается получить его, просмотрев часть apollo в хранилище.
Ни один из моих вариантов не удовлетворяет меня. Итак, как бы я сделал это правильно?