Apollo 클라이언트 (버전 1.x)가있는 GraphQL 서버에 액세스하는 React 앱이 있습니다. 다음과 같은 서버 스키마가 있습니다.Apollo GraphQL에서 refetchQueries를 사용하지 않아도됩니까?
type Query {
currentShop: Shop
}
type Shop {
id: ID!
name: String!
products: [Product!]!
...etc
}
나는 이와 같이 정의 된 dataIdFromObject
을 가지고 있습니다.
const dataIdFromObject = o => {
if (o.__typename != null && o.id != null) {
return `${o.__typename}-${o.id}`
}
return null
}
, 나는 currentShop
의 다양한 분야를 묻는 쿼리를 실행하고 있습니다. 여러 지점에서 currentShop
을 변경하는 돌연변이가 있으며 돌연변이는 항상 Shop
유형을 반환합니다. 그러나 currentShop
과 관련이 없으므로 Apollo는 루트 쿼리 캐시 포인터를 업데이트하는 방법을 알 수 없습니다.
CodeSandbox으로 문제를 나타내는 데모를 완벽하게 만들었습니다. 백엔드는 Apollo LaunchPad으로 만듭니다. 다른 분기를 선택하고 몇 초 기다렸다가 (최적화에 신경 쓰지 않았 음) 작동합니다.
"마법"은 ShopSelectButton
구성 요소에서 발생합니다. refetchQueries
행을 주석 처리하면 문제가 발생합니다. 상점은 서버에서 올바르게 선택되어 있습니다 (다시로드 한 후에 보게됩니다). 그러나 클라이언트는 죽은 동물처럼 행동합니다.
제 문제는 refetchQueries
입니다. 코드가 너무 밀접하게 결합되어 있습니다. 다른 구성 요소와 필요에 대해 알기 위해 앱의 한 구성 요소에 구성 요소를 갖고 싶지 않습니다. 또한 정직하게 말하자면, 다시 패치한다는 것은 캐시 전체를 돌아 다니며 대부분의 경우 불필요한 백엔드에서 항상 읽음을 의미합니다.
다른 접근 방법이 궁금합니다. 스키마가 더 많은 상태 비 저장되고 프론트 엔드 앱에 상태를 유지해야합니까?
그래, 나는 꽉 끼는 커플 링을 좋아하지 않는다. 특히 내 애플 리케이션이 모듈이되어야 모듈이 어떤 모듈인지 알지 못한다. – FredyC
또한 나는 당신이 묘사하고있는 관계가 거기에 있다고 생각하지 않습니다. 'currentShop'는 특정 typename : id를 가리키고 갑자기 서버에서만 변경됩니다. 아폴로는 그것을 알 수있는 방법이 없습니다. 기본적으로 작동하는이 포인터를 업데이트하기 위해'writeQuery'를 사용하여 시도했지만 모든 쿼리에 대한 다른 모든 필드가 여전히 부족합니다. – FredyC
어쨌든, 나는 무국적 서버가 아마도 더 나은 접근법이라는 것을 깨닫게되었다. 이것은 그 시도의 결과입니다. https://codesandbox.io/s/ly9j7w1l9 – FredyC