@Raybul

Как получать актуальные данные с сервера при мутации Apollo client?

Всем привет, только начал изучать Apollo client и столкнулся со сложностью.
есть список юзеров и есть запрос getuser , когда я кликаю на юзера, отрабатывает useQuery в который я пробрасываю userId, и мне прилетают например его имя, фамилия и статус, если я кликаю "моя страница" то в useQuery пробрасываю myId и мне прилетают мои параметры. В чем собственно вопрос:
если я меняю у себя допустим статус, как мне отобразить его на странице без рестарта страницы?
Варианты которые я пробовал:
1. просто после каждого изменения какого либо поля вызывать refetch(). Проблема в том что если инфы будет много то при изменении допустим одного статуса, нет смысла возвращать весь обьект.
2. создавать запросы например которые возвращают мою личную информацию (getStatus, getName) и тд ,если я на чужой странице то отрисовывать инфу которая возвращается по запросу getUser, а если я на своей страницы то отрисовывать то что мне возвращает мои запросы, тогда при мутации статуса я вызываю getStatus и он обновляется. Ну тут проблема в том что под каждый обьект придется писать отдельный запрос.
3. хранить инфу в useState, например:
const [newStatus, setNewStatus] = useState<string>('');
<div>{newStatus || data?.getUser.status}</div> 
<Input type="text" value={newStatus} onChange={(e) => setNewStatus(e.target.value)} />

но проблема в том что если я после изменения статуса перехожу на стр к другому юзеру, а потом обратно на свою то сначала на долю секунды отображается старый статус а потом уже новый, так не пойдет)
Как решить вопрос? заранее благодарю )
  • Вопрос задан
  • 123 просмотра
Решения вопроса 1
@Raybul Автор вопроса
решение
const [editStatus, {data, loading, error}] = useMutation(EDIT_STATUS)

const submitNewStatus = () => {
        editStatus({
            variables: {
                id: myId,
                status: newStatus,
            },
        }).then((data) => {
            client.writeFragment({
                id: `User:${currentId}`,
                fragment: gql`
                    fragment user on User {
                        status
                    }
                `,
                data: {
                    __typename: 'User',
                    status: data?.data.editStatus.status
                }
            })
        })
    }
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы