Как я могу повторно запросить запрос вне его обернутого компонента?

У меня есть два экрана:

Screen1: результаты

Screen2: Редактировать фильтры

Когда я редактирую фильтры на Screen2 и нажимаю назад, я хотел бы повторно запросить запрос на Screen1 (с недавно созданной строковой переменной фильтра). Редактирование фильтров не использует мутацию и не запускает какие-либо действия Redux (я сохраняю поисковые фильтры / предпочтения пользователей в localStorage/AsyncStorage вместо базы данных, поэтому мутации нет). Я просто изменяю локальное состояние формы и использую его для создания строки фильтра, которую я хочу передать определенному запросу на Screen1. У меня есть доступ к строке фильтра на обоих экранах, если это помогает.

Это похоже на refetch() ограничен компонентом, к которому относится запрос: http://dev.apollodata.com/react/receiving-updates.html так как мне выполнить запрос с другого экрана?

Я попытался выставить один и тот же запрос на Screen1 и Screen2, затем вызвать повторную проверку на Screen2, и хотя запрос работает и получает новые данные на Screen2, тот же запрос имени не обновляется на Screen1, где он мне действительно нужен. Разве не должно быть, если они имеют одинаковое имя? (но переменная filters изменилась)

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

1 ответ

Я сделал то же самое здесь. Сценарий: - Я выбираю одноранговый узел для фильтрации некоторых сообщений. - Я держу peerId в избыточности - я делаю оба компонента (фильтр и список) зависимыми от этого значения избыточности.

Как это:

1 - Поместить это значение фильтра в Redx (и вернуть его обратно):

import { compose, graphql } from 'react-apollo'
import { connect } from 'react-redux';
...
export default compose(
    connect(
        (state,ownProps) => ({ 
            selectedMessages: state.messages.selectedMessages,
            peerId: state.messages.peerId
        }),
        (dispatch) => ({
            clearSelection: () => dispatch(clearSelection()),
            setPeer: (peerId) => dispatch(setPeer(peerId))
        })
    ),
    graphql(
        PEERS_QUERY,
...

когда вы сначала вызываете connect (используя compose), прежде чем вызывать оболочку graphql или за ее пределами, у вас будет peerId, доступный в качестве опоры в вашей оболочке graphql, так что вы можете использовать его для фильтрации вашего запроса:

export default compose(
    connect(
        (state,ownProps) => { 
            return {
                peerId: state.messages.peerId,
                selectedMessages: state.messages.selectedMessages
            }
        },
        (dispatch) => ({
            toggleMessage(messageId) {
                dispatch(toggleMessage(messageId));
            }
        })
    ),
    graphql( // peerId is available here because this is wrapped by connect
        MESSAGES_QUERY,
        {
            options: ({peerId}) => ({variables:{peerId:peerId}}),
            skip: (ownProps) => ownProps.peerId === '',
            props: ({
            ...
        ...
    ...
)(MessageList);
Другие вопросы по тегам