Apollo Client Reactive 变量 - 更新值后不触发重新渲染

Ar2*_*r26 3 reactjs apollo-client reactive-variable

我正在尝试使用反应变量:

我的缓存文件:

import { makeVar } from "@apollo/client"

export const colorVar = makeVar('red')
Run Code Online (Sandbox Code Playgroud)

文件 A(更新值):

import { colorVar } from "cache"
colorVar('green')
Run Code Online (Sandbox Code Playgroud)

文件 B(读取值并应在文件 A 中更新值后重新渲染):

import { colorVar } from "cache"
console.log(colorVar())
Run Code Online (Sandbox Code Playgroud)

文件 A 中的更新操作不会触发文件 B 的重新渲染

Ar2*_*r26 9

缓存文件(为 ApolloClient 使用该缓存):

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

更新变量(文件 A):

import { colorVar } from "cache"
 colorVar('green')
Run Code Online (Sandbox Code Playgroud)

读取变量(文件 B):

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

  const { data } = useQuery(GET_COLOR_Q);

  console.log(data?.getColor)
Run Code Online (Sandbox Code Playgroud)

更新:从 Apollo Client 3.2.0 开始,您可以使用 useReactiveVar 钩子来获取数据(文件 B):

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

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

// write
colorVar('green')
Run Code Online (Sandbox Code Playgroud)


小智 6

您可以执行以下操作:

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

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

// to update
colorVar(your preferred color)
Run Code Online (Sandbox Code Playgroud)