Я читал 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, usenode(id: $id)
, notnode(id: $id) { ... }
Возможно, маршруты более упрощены, чем я думал? Может быть, глубина одного уровня - это все, что вы можете сделать?