如何在React Native的同步数据JS函数中使用Apollo GraphQL?
Got it, let's convert your existing REST-based data sync flow to use Apollo GraphQL. I'll break this down into actionable steps that fit right into your current code structure.
Step 1: Install Required Dependencies
First, add Apollo Client and GraphQL to your project:
# Using npm npm install @apollo/client graphql # Or using yarn yarn add @apollo/client graphql
Step 2: Set Up Apollo Client
Create a new file (like apolloClient.js) to configure your Apollo Client instance, which connects your app to your GraphQL server:
import { ApolloClient, InMemoryCache, createHttpLink } from '@apollo/client'; import { setContext } from '@apollo/client/link/context'; import AsyncStorage from '@react-native-async-storage/async-storage'; // Note: React Native's AsyncStorage is now in this dedicated package // Create HTTP link pointing to your GraphQL server const httpLink = createHttpLink({ uri: 'https://your-graphql-server-url.com/graphql', // Replace with your actual server URL }); // Optional: Add auth headers if your server requires authentication const authLink = setContext(async (_, { headers }) => { const token = await AsyncStorage.getItem('authToken'); return { headers: { ...headers, authorization: token ? `Bearer ${token}` : '', }, }; }); // Combine links and initialize the client const client = new ApolloClient({ link: authLink.concat(httpLink), // Skip authLink if you don't need authentication cache: new InMemoryCache(), }); export default client;
Then wrap your root component with ApolloProvider to make the client available throughout your app (usually in App.js):
import { ApolloProvider } from '@apollo/client'; import client from './apolloClient'; import YourMainComponent from './YourMainComponent'; export default function App() { return ( <ApolloProvider client={client}> <YourMainComponent /> </ApolloProvider> ); }
Step 3: Replace REST getData with GraphQL Query
Let's rewrite your getData function to use Apollo Client instead of REST. First, define your GraphQL query (adjust this to match your server's schema):
import { gql } from '@apollo/client'; import client from './apolloClient'; import AsyncStorage from '@react-native-async-storage/async-storage'; import { Alert } from 'react-native'; // Define your GraphQL query - match fields and variables to your server's schema const GET_SYNC_DATA = gql` query GetSyncData($lastSynched: Float) { syncData(lastSynched: $lastSynched) { id // Add all the fields you need from your server title content updatedAt } } `; // Updated getData function using Apollo GraphQL async function getData() { try { const lastSynched = await AsyncStorage.getItem('data.lastSynched'); const lastSynchedTimestamp = lastSynched ? Number(lastSynched) : 0; // Execute the GraphQL query with Apollo Client const { data, error } = await client.query({ query: GET_SYNC_DATA, variables: { lastSynched: lastSynchedTimestamp }, }); if (error) { throw new Error(error.message); } // Return the fetched data (matches your old getData return structure) return data.syncData; } catch (err) { Alert.alert('Sync Error', err.message); return []; } }
Step 4: Update Your synchronize Function
Your existing synchronize function will work almost identically—we're just swapping the underlying data source from REST to GraphQL:
import { getData } from './api/index'; // Now this getData uses Apollo import AsyncStorage from '@react-native-async-storage/async-storage'; export default async function synchronize(navigator) { const data = await getData(); // ... Your existing logic to store data in local database ... // Don't forget to update the last synched timestamp after successful sync await AsyncStorage.setItem('data.lastSynched', Date.now().toString()); }
Key Notes
- Double-check that your GraphQL query matches your server's schema exactly (field names, variable types, etc.).
- If you need to send local data back to the server (e.g., create/update records), use
client.mutate()instead ofclient.query(). - Apollo Client automatically caches data, so you can leverage this for better performance if needed—though for sync purposes, we're using a direct query to fetch fresh data.
内容的提问来源于stack exchange,提问作者user3142695

