Реагирует ли маршрутизатор-реле с шаблоном реле?
Я использую React-маршрутизатор-реле в проекте. Мне кажется, что дизайн мне не подходит, учитывая, что каждый компонент в основном заканчивается фрагментом с тем же именем, что и корневой запрос. Разве каждый компонент не должен иметь уникально именованные фрагменты любого произвольного типа в корневом запросе? Возможно ли это с помощью этого пакета или мое мышление здесь ошибочно?
Редактировать: Возможно, мой вопрос был немного расплывчатым. Моя проблема заключается в том, что для атрибута запросов, по сути, есть два правила, которые определены в реагирующем маршрутизаторе-ретрансляторе, которые применяют, как мне кажется, странный шаблон проектирования. Эти два правила:
- Каждый запрос может идти только на один уровень.
- Каждый запрос должен отображаться на фрагмент с идентичным именем в компоненте, который его использует.
Это оставляет вас со сценарием, в котором вы либо:
- Используйте один и тот же запрос "просмотра" для каждого компонента и определите дополнительный фрагмент "просмотра" для каждого компонента. Все эти фрагменты будут определять разные требования к данным, несмотря на то, что они имеют одно и то же имя, что кажется очень запутанным.
- Вы создаете уникальные имена фрагментов для разных компонентов, а затем повторяете один и тот же точный корневой запрос с разными именами в зависимости от типа данных, которые вы хотите получить, что кажется совершенно глупым.
1 ответ
Хороший вопрос. Когда вы имеете дело с Relay, вы думаете, что правильно, так как каждый компонент должен иметь свой собственный фрагмент, чтобы сам запрос отображался точно в данные, необходимые для этого конкретного компонента. Наименование фрагментов может быть любым, как бы оно ни называлось, но тип не может быть произвольным. Это должен быть объявленный тип под объектом Root Query (или любым другим полем, к которому вы добавляете фрагмент). В противном случае фрагмент выдаст ошибку о том, что вы не можете запросить этот тип в Query или поле.
Например:
var componentOneFragment = Relay.QL`
fragment on User {
name
}
`;
Здесь следует отметить, что вам не нужно иметь имя для таких фрагментов, как fragment userFragment on User { ... }
, Это даст вам больше гибкости при динамической ссылке на фрагменты компонента из запросов на ретрансляцию в вашем маршрутизаторе путем объявления ${Component.getFragment(componentOneFragment)}
, Надеюсь это поможет!
РЕДАКТИРОВАТЬ:
Используйте один и тот же запрос "просмотра" для каждого компонента и определите дополнительный фрагмент "просмотра" для каждого компонента. Все эти фрагменты будут определять разные требования к данным, несмотря на то, что они имеют одно и то же имя, что кажется очень запутанным
Хотя тот факт, что идентичные имена фрагментов могут показаться запутанными, это лучший способ думать о вещах. Каждый компонент действительно имеет разные требования к данным, поэтому, естественно, их контейнеры Relay будут иметь разные фрагменты, но все еще с тем же именем фрагмента.
Этот фрагмент может быть включен в один из ваших Relay-контейнеров, которым нужны данные пользователя:
const WidgetList = Relay.createContainer(/* ... */, {
initialVariables: {
color: null,
size: null,
limit: null
},
fragments: {
viewer: () => Relay.QL`
fragment on User {
widgets(color: $color, size: $size, first: $limit) {
edges {
node {
name,
},
},
},
}
`
}
});
Хотя этот фрагмент (с тем же именем) может быть включен в другой контейнер Relay, который нуждается в данных виджета:
const ActionsList = Relay.createContainer(/* ... */, {
initialVariables: {
input: null
},
fragments: {
viewer: () => Relay.QL`
fragment on Widget {
actions(input: $input) {
edges {
node {
name,
},
},
},
}
`
}
});
Оба могут использоваться динамически (т.е. $Component.getFragment('viewer')
) в одном и том же запросе GraphQL, если пользователь и виджет являются типами объекта Root Query.