К сожалению, в React или Apollo нет такой вещи, как «глобальная» опора.Если вы хотите достичь чего-то похожего на ваш пример (то есть обновить состояние корневого компонента из вашего компонента входа в систему), рассматривали ли вы возможность передачи метода до указанного компонента и его запуска при разрешении мутации GraphQL?
Я собираюсь сделать попытку этого, но, пожалуйста, обратите внимание, что это весь псевдокод, и он лишь обрисовывает в общих чертах один из многих подходов, которые вы можете предпринять для решения этой проблемы:
Приложение.js
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
userInfo: {},
authed: false,
}
this.modifyUserInfo = this.modifyUserInfo.bind(this);
}
modifyUserInfo(userInfo) {
this.setState(state => ({
...state,
userInfo,
authed: true,
}))
}
render() {
return (
// Render all your routes and everything...
<LoginComponent loginCb={modifyUserInfo} />
)
}
}
Компонент входа в систему
const Login = props => {
return (
<Mutation mutation={loginMutation}>
{(login) => {
<form onSubmit={(e) => {
e.preventDefault();
login()
.then(res => {
if (res.userInfo) {
props.loginCb(res.userInfo);
}
})
.catch(err => {
console.log(err)
})
}}>
{/* Add the rest of your login form */}
<button type="submit"/>
</form>
}}
</Mutation>
)
}
Вместо того, чтобы хранить свои данные для аутентификации пользователя в корневом состоянии, рассматривали ли вы возможность использования кэша Apolloи вводить пользовательскую информацию в соответствующие компоненты?Как я уже сказал, есть много разных подходов к этому.