Реактивные переменные клиента Apollo - не запускать повторную визуализацию после обновления значения

Я пытаюсь использовать реактивные переменные:

Мой файл кеша:

import { makeVar } from "@apollo/client"

export const colorVar = makeVar('red')

Файл A (обновление значения):

import { colorVar } from "cache"
colorVar('green')

Файл B (считывает значение и должен повторно визуализироваться после обновления значения в файле A):

import { colorVar } from "cache"
console.log(colorVar())

Действие обновления в файле A не запускает повторную визуализацию файла B

3 ответа

Решение

Файл кеша (используйте этот кеш для ApolloClient):

export const cache: InMemoryCache = new InMemoryCache({
  typePolicies: {
    Query: {
      fields: {
        getColor()
          return colorVar();
        }
      }
    }
  }
});
export const colorVar = cache.makeVar('red')

Обновите переменную (файл A):

import { colorVar } from "cache"
 colorVar('green')

Прочтите переменную (файл B):

 const GET_COLOR_Q = gql`
     query readColor {
        getColor @client
    }
  `;

  const { data } = useQuery(GET_COLOR_Q);

  console.log(data?.getColor)

Обновление: из Apollo Client 3.2.0 вы можете использовать перехватчик useReactiveVar для получения данных (файл B):

import { useReactiveVar } from '@apollo/client'
import { colorVar } from "cache"

const color = useReactiveVar(colorVar)
console.log(color)

Вы можете сделать следующее:

      import { useReactiveVar } from "@apollo/client";
import { colorVar } from "cache"

// to read
const color = useReactiveVar(colorVar);

// to update
colorVar(your preferred color)

В качестве небольшого обновления к предыдущим ответам вы можете сделать это более "традиционным" способом реагирования, например:

      import { useReactiveVar } from '@apollo/client'
import { colorVar } from 'cache'

const useColor = () => {
    const color = useReactiveVar(colorVar);
    const setColor = (color) => {
        colorVar(color);
    };

    return [color, setColor];
}
Другие вопросы по тегам