You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React+Apollo Client报错:cache.writeData is not a function 求助

解决Apollo Client中cache.writeData is not a function错误

你遇到的错误是因为Apollo Client 3.x及以上版本已移除InMemoryCache的writeData方法,旧版本的该API在新版本中被更精确的缓存操作方法替代。

以下是两种可行的解决办法:

方法一:使用writeQuery写入缓存

先定义匹配客户端状态的查询,再通过writeQuery写入初始数据:

import logo from './logo.svg';
import './App.css';
import Pages from './pages';
import GlobalStyles from './components/GlobalStyles';

import { ApolloClient, ApolloProvider, createHttpLink, InMemoryCache, gql } from '@apollo/client';
import { setContext } from 'apollo-link-context';

const uri = process.env.REACT_APP_BASE_URL;
const httpLink = createHttpLink({ uri });
const authLink = setContext((_, { headers }) => {
    return {
        headers: {
            ...headers,
            authorization: localStorage.getItem('token') || ''
        }
    }
})
const cache = new InMemoryCache();

// 定义匹配客户端状态的查询
const IS_LOGGED_IN = gql`
  query IsLoggedIn {
    isLoggedIn @client
  }
`;

// 配置Apollo Client
const client = new ApolloClient({
    link: authLink.concat(httpLink),
    cache,
    resolvers: {},
    connectToDevTools: true
})

// 用writeQuery替代原writeData写入缓存
cache.writeQuery({
  query: IS_LOGGED_IN,
  data: { isLoggedIn: !!localStorage.getItem('token') }
});

function App() {
    return (
        <ApolloProvider client={client}>
            <GlobalStyles/>
            <Pages/>
        </ApolloProvider>
    );
}

export default App;

方法二:初始化缓存时设置默认值

如果仅需在应用启动时设置初始状态,可直接在创建InMemoryCache时配置defaults:

import logo from './logo.svg';
import './App.css';
import Pages from './pages';
import GlobalStyles from './components/GlobalStyles';

import { ApolloClient, ApolloProvider, createHttpLink, InMemoryCache } from '@apollo/client';
import { setContext } from 'apollo-link-context';

const uri = process.env.REACT_APP_BASE_URL;
const httpLink = createHttpLink({ uri });
const authLink = setContext((_, { headers }) => {
    return {
        headers: {
            ...headers,
            authorization: localStorage.getItem('token') || ''
        }
    }
})

// 初始化缓存时直接设置默认登录状态
const cache = new InMemoryCache({
  defaults: {
    isLoggedIn: !!localStorage.getItem('token')
  }
});

// 配置Apollo Client
const client = new ApolloClient({
    link: authLink.concat(httpLink),
    cache,
    resolvers: {},
    connectToDevTools: true
})

function App() {
    return (
        <ApolloProvider client={client}>
            <GlobalStyles/>
            <Pages/>
        </ApolloProvider>
    );
}

export default App;

注意事项

  • 若使用带@client指令的客户端状态查询,需确保resolvers配置正确(如需后续动态修改状态)。
  • 两种方法均可实现初始化登录状态缓存的需求:需动态更新状态选writeQuery更灵活;仅需初始值则defaults更简洁。

内容的提问来源于stack exchange,提问作者github.arief

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 18:35:14