2015-10-13 2 views
1

Я читал the material, но я все еще не понимаю.Как состав запроса работает между Контейнером и Маршрутом в Реле?

появляется Этот маршрут:

var profileRoute = { 
    queries: { 
    // Routes declare queries using functions that return a query root. Relay 
    // will automatically compose the `user` fragment from the Relay container 
    // paired with this route on a Relay.RootContainer 
    X:() => Relay.QL` 
     # In Relay, the GraphQL query name can be optionally omitted. 
     query { user(id: $userID) } 
    `, 
    }, 
    params: { 
    // This `userID` parameter will populate the `$userID` variable above. 
    userID: '123', 
    }, 
    // Routes must also define a string name. 
    name: 'ProfileRoute', 
}; 

(я намеренно заменил user с X выше, где он не имеет никакого влияния на результирующий запрос GraphQL для того, чтобы убедиться, что он не оказывает никакого влияния на состав graphql)

И это будет работать в паре с этим контейнером:

module.exports = Relay.createContainer(ProfilePicture, { 
    // Specify the initial value of the `$size` variable. 
    initialVariables: { 
    size: 32 
    }, 
    // For each of the props that depend on server data, we define a corresponding 
    // key in `fragments`. Here, the component expects server data to populate the 
    // `X` prop, so we'll specify the fragment from above as `fragments.X`. 
    fragments: { 
    X:() => Relay.QL` 
     fragment on User { 
     profilePhoto(size: $size) { 
      uri, 
     }, 
     } 
    `, 
    }, 
}); 

Это, вероятно, будет COMPOS e в чем-то вроде этого:

query { 
    user(id: $userID) { 
    profilePhoto(size: $size) { 
     uri 
    } 
    } 
} 

Но в чем тут логика? Возможно, он получает тип User из фрагмента, а затем ищет способ добраться до этого типа в качестве прямого потомка чего-то, что соответствует запросу? То есть, из компиляции GraphQL известно, что в query { user(id: $userID) { X } } X обозначает место, где можно найти тип пользователя.

Пока единственные примеры, которые я видел, имеют чрезвычайно простой линейный запрос в маршрутизаторе. Может ли быть более сложным? Что произойдет, если вы сделаете запрос, который отключается в двух разных направлениях и заканчивается тем, что подходит к двум различным источникам объектов пользователя? Как он мог знать, какой из них вы хотели? Я предполагаю, что подобные запросы недопустимы. Я также предполагаю, что единственное место, где он выглядит в этих запросах, является самой глубокой точкой, поэтому, если ваш запрос маршрутизатора был чем-то вроде query { user(id: "52") { bestFriend } }, где bestFriend также является пользователем, он предоставит вам bestFriend вместо пользователя 52.

Это даже разрешено иметь запрос с более чем одним уровнем глубины в нем? Я попробовал это, и у меня получилась эта ошибка:

Invariant Violation: Relay.QL: Expected query user to be empty. For example, use node(id: $id) , not node(id: $id) { ... }

Возможно, маршруты более упрощены, чем я думал? Может быть, глубина одного уровня - это все, что вы можете сделать?

ответ

1

Композиция более упрощена, чем вы думали. Запросы могут иметь только глубину одного уровня, и фрагмент на составном компоненте с тем же именем (например, в этом случае X) по существу сложен (...fragment).

Реле теоретически может поддерживать произвольно сложные запросы, но существующего решения до сих пор было достаточно. Это связано с тем, что произвольно сложные запросы могут быть разбиты на простой запрос и новый компонент верхнего уровня.

I also assume that the only place it looks in these queries is the deepest point [...]

Это сообразительная идея.

Смежные вопросы