要解决Apollo GraphQL的“writeQuery”导致应用程序重新渲染,从而导致不必要的网络请求问题,可以采取以下步骤:
useMutation
钩子,而不是writeQuery
方法。useMutation
钩子可以使用GraphQL mutation来更新数据,并且只会重新渲染与该Mutation相关的组件。示例代码:
import { useMutation } from '@apollo/client';
import { UPDATE_TODO_MUTATION } from './graphql/mutations';
const TodoItem = ({ todo }) => {
const [updateTodo] = useMutation(UPDATE_TODO_MUTATION);
const handleComplete = () => {
updateTodo({
variables: { id: todo.id, completed: true },
});
};
return (
{todo.title}
);
};
fetchPolicy
为cache-first
。这将使Apollo Client首先尝试从缓存中获取数据,而不是进行网络请求。示例代码(使用Apollo Client v3):
import { ApolloClient, InMemoryCache } from '@apollo/client';
const client = new ApolloClient({
uri: 'https://api.example.com/graphql',
cache: new InMemoryCache(),
defaultOptions: {
watchQuery: {
fetchPolicy: 'cache-first',
},
},
});
refetchQueries
选项。refetchQueries
会导致重新执行相关查询并重新渲染组件,从而触发不必要的网络请求。相反,使用update
函数来手动更新缓存中的数据。示例代码:
import { useMutation } from '@apollo/client';
import { UPDATE_TODO_MUTATION } from './graphql/mutations';
import { GET_TODO_QUERY } from './graphql/queries';
const TodoItem = ({ todo }) => {
const [updateTodo] = useMutation(UPDATE_TODO_MUTATION, {
update: (cache, { data }) => {
cache.writeQuery({
query: GET_TODO_QUERY,
variables: { id: todo.id },
data: { todo: data.updateTodo },
});
},
});
const handleComplete = () => {
updateTodo({
variables: { id: todo.id, completed: true },
});
};
return (
{todo.title}
);
};
通过采取上述步骤,可以避免不必要的网络请求并提高应用程序的性能。