Может ли Reet's RefetchContainer обновить родственные компоненты с помощью функции refetch? - PullRequest
0 голосов
/ 07 сентября 2018

Можно ли обновить реквизиты компонента, вызвав refetch из одноуровневого компонента?

Рассмотрим компоненты со следующей структурой:

<Home> # wrapped in a QueryRenderer
    <List /> # wrapped in a Fragment Container
    <Map /> # wrapped in a Refetch Container
</Home>

List и Map используют одну и ту же конечную точку запроса: allItems.

Когда Map вызывает refetch, он обновляет свои данные, однако данные List не обновляются.

Запрос на повторное получение идентичен запросу Home QueryRenderer. Похоже, что Relay не отображает результат повторного поиска в те части магазина, в которых хранятся данные для List, поскольку реквизиты List не изменяются.

Возможно ли для повторной проверки обновить реквизиты вне компонента, который содержит контейнер Refetch? Если нет, то как изменения в одном компоненте могут инициировать повторное обновление и обновить реквизиты одноуровневого компонента, не переводя контейнер повторного поиска на более высокий уровень - если только это не единственный способ?

Для большего контекста я включил некоторый код, чтобы проиллюстрировать структуру и запросы более четко.

Используя Relay, предположим, что у нас есть родительский компонент, обернутый в QueryRenderer для выполнения начальной выборки данных.

        <QueryRenderer
            environment={environment}
            query={graphql`
                query HomeQuery {
                    ...List_query
                    ...Map_query
                }
            `}
            render={({ error, props }) => {
                if (error) {
                    console.log(error)
                    return <div>Error!</div>
                }
                if (!props) {
                    return <div>Loading...</div>
                }

                return (
                    <div>
                        <List query={props} />
                        <Map query={props} />
                    </div>
                )
            }}
        />

Оба List и Map содержат фрагменты. List завернут в контейнер с фрагментами:

createFragmentContainer(List, {
    query: graphql`
        fragment List_query on Query {
            allItems(first: 10) @connection(key: "Map_allItems") {
                edges {
                    node {
                        id
                        name
                    }
                }
            }
        }
    `
})

Принимая во внимание, что Map завернут в контейнер Refetch:

createRefetchContainer(
    Map,
    {
        query: graphql`
            fragment Map_query on Query {
                allItems(first: 10) @connection( key: "Map_allItems") {
                    edges {
                        node {
                            id
                            name
                            created
                        }
                    }
                }
            }
        `
    },
    graphql`
        query MapRefetchQuery {
            ...Map_query
            ...List_query
        }
    `
)

Код был уменьшен, поэтому возможно, что в нем есть опечатка! Дайте мне знать, если это так, и я обновлю его.

...