#reactjs #graphql #apollo #react-apollo
#reactjs #graphql #apollo #реагировать-apollo
Вопрос:
В моем приложении React, когда пользователь переходит на myapp.com/org/companyname
, оно загружает страницу со следующей логикой, чтобы получить некоторые основные сведения о компании на основе названия компании в URL:
const FIND_COMPANY = gql`
query CompanyQuery($companyName: String!) {
company(name: $companyName) {
... on Company {
name
description
}
... on Error {
errorMessage
}
}
}
`;
<Query
query={FIND_COMPANY}
variables={{
companyName: this.props.location.pathname.split("org/")[1]
}}
>
{({ data }) => {
if (data.company.errorMessage)
return <div>{data.company.errorMessage}</div>;
return (
<div>
<h1>{data.company.name}</h1>
<p>{data.company.description}</p>
</div>
);
}}
</Query>
Это работает нормально, однако я хочу сохранить только текущее название компании в локальном состоянии Apollo, чтобы другие компоненты могли легко получить к нему доступ без необходимости манипулировать строками с URL-адресом в каждом компоненте.
Чтобы сделать это, я проследил за разделом «Прямая запись» документации Apollo local state docs и в итоге получил следующее:
<ApolloConsumer>
{client => (
<Query
query={FIND_COMPANY}
variables={{
companyName: this.props.location.pathname.split("org/")[1]
}}
onCompleted={data =>
client.writeData({ data: { companyName: data.company.name } })
}
>
{({ data }) => {
if (data.company.errorMessage)
return <div>{data.company.errorMessage}</div>;
return (
<div>
<h1>{data.company.name}</h1>
<p>{data.company.description}</p>
</div>
);
}}
</Query>
}
</ApolloConsumer>
Где я записываю только название компании в локальное состояние Apollo onCompleted
. Однако, когда я запускаю это, приложение завершает работу с ошибкой.
Это правильный способ сохранения локального состояния в Apollo или я неправильно понял, как следует использовать локальное состояние Apollo?
Комментарии:
1. Запрос уже сохранен, зачем вам сохранять результат снова. Если вам нужна информация в других местах, просто используйте точно такой же запрос, и apollo получит данные из хранилища вместо того, чтобы выполнять внутренний вызов. Также, если вы хотите использовать объект
id
in your company, вы могли бы использоватьreadFragment
для извлечения только компании из хранилища.2. Главное, чего я хотел избежать, — это манипулирования строками с URL-адресом, чтобы получить название компании для выполнения запроса, но я использую
react-router
, поэтому заменил его наmatch.params.companyName
. Я думаю, что попытка избежать этого привела меня к желанию сохранить значение в другом месте, что было неправильно. Спасибо за совет по использованиюreadFragment
.