Я собираю список данных с 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
в хранилище.
Ни один из моих вариантов не удовлетворяет меня. Итак, как бы я сделал это правильно?