Comments (8)
no, I did not, but I guess with memorized version you can actually prevent re-rendering e.g:
const mutate = useMutation(MUTATION)
const memoizedMutation = useCallback(() => {
mutate({
variables,
});
}, [mutate]);
return (<button onClick={memoizedMutation}>click on me</button>);
with current implimention mutate
always have a new value therefore it might re-render more...
from react-apollo-hooks.
Checking for mutation
itself is not enough, we have to check for changes of options
parameters, and this will create unnecessary memoization most of the times.
Anyways, React team does not suggest to pass individual callbacks in props and there is (not ideal) solution for this. I hope they will come up with better idea.
But if you don't like it, you still can use your own hook for memoization , e.g:
function useMemoMutation(mutation, options, inputs) {
return useCallback(useMutation(mutation, option), inputs);
}
function Foo({ bar, baz }) {
const mutate = useMemoMutation(Mutate, {
variables: { bar, baz }
}, [bar, baz]) // Update only on `bar` or `baz` change
}
from react-apollo-hooks.
@sijad Have you tried to profile it if the version with memoization is really faster than the current one?
from react-apollo-hooks.
We also can useRef
to imitate this
in class components:
export function useMutation<TData, TVariables = OperationVariables>(
mutation: DocumentNode,
baseOptions?: MutationHookOptions<TData, TVariables>
): MutationFn<TData, TVariables> {
const client = useApolloClient();
// Use refs to access variable values inside callback.
const mutationRef = useRef(mutation);
const baseOptionsRef = useRef(baseOptions);
// Update references on each render.
mutationRef.current = mutation;
baseOptionsRef.current = baseOptions;
// Memoize callback.
const mutationFnRef = useRef<MutationFn<TData, TVariables>>(options =>
client.mutate({
mutation: mutationRef.current,
...baseOptionsRef.current,
...options,
})
);
return mutationFnRef.current;
}
from react-apollo-hooks.
A downside of not memoizing the value of useMutation
or useQuery
is that they break the memoization of hooks that are built on top of them if you follow the rules (and eslint plugin) for hooks strictly.
from react-apollo-hooks.
I just leave @gaearon's comment here.
in my test objToKey
seems slower that deep equal.
from react-apollo-hooks.
should not this be closed by apollographql/react-apollo#3260 ?
from react-apollo-hooks.
@prztrz this library doesn’t use React-apollo’s useMutation (this preceded that!)
If you switch to @apollo/hooks or whatever that package name is, then that fix will be relevant. Cheers!
from react-apollo-hooks.
Related Issues (20)
- Unable to Access Result Attributes
- Calling a mutation within React.useEffect causes infinite loop HOT 8
- Error on refetch
- Apollo client not handing Throw Error networkError eg.400,500
- data is no longer defined in 0.5.0 before data is loaded HOT 2
- Archive repo
- TypeError: Object(...) is not a function
- Question: How can I abort a query already in progress? HOT 1
- useLazyQuery ignores request if one is in progress (or how to cancel running requests)
- Support for `renderToStream`
- Correct network response but incorrect data object HOT 2
- Prevent infinite loop with useQuery
- Does useQuery hook uses local state for storing the data it receives from the server ?
- useSubscription - Duplicated subscription on page refresh HOT 1
- Refetching useQuery with skip: true results in a network request but does not update data
- Testing useSubscription and no responses when other mutations being mocked
- dynamic input variables in react-apollo-hooks
- Is it possible to map the result of one query to another query? HOT 1
- Is there any way to use multiple queries before a component render inside the component itself?
- UseQuery is not calling any API in the network side, when I console.log response, I am seeing this. what could be wrong here?
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from react-apollo-hooks.