Daniel Mocan

Engineering Manager

Meetup organizer 

 @danielsmocan

Classic Data Fetching

import React, {useEffect, useState} from 'react';
import apiService  from '../utils/apiService';

const Products = () => {
    const [ products, setProducts] = useState();
    const [ isLoading, setLoading] = useState(true);
    
    useEffect(() => {
        const getProducts =  async () => {
            const products = await apiService.getProducts();
            if(products){
                setProducts(products)
            }
            setLoading(false);
        }
        getProducts();
    },[]);

    return (
        <div>
            <h2>Products</h2>
            {isLoading && <div>...loading</div>}
            { products && products.map( product => <div>{product.productName}</div>)}
        </div>
    )
};

React Query

import React from 'react';
import { useQuery } from '@tanstack/react-query';
import apiService  from '../utils/apiService';

const ProductsRQ = () => {
    const { data: products, isLoading } = useQuery(['products'], apiService.getProducts);
    
    return (
        <div>
            <h2>RQ Products</h2>
            { isLoading && <div>...loading</div> }
            { products && products.map( product => <div>{ product.productName }</div>)}
        </div>
    )
};

With...

Easy Setup

import { QueryClientProvider, QueryClient } from '@tanstack/react-query';
import { ReactQueryDevtools } from '@tanstack/react-query-devtools';

const queryClient = new QueryClient();

const App => () => {
  return (
    <QueryClientProvider client={queryClient}>
     	<div>
		App Components
        </div>
      <ReactQueryDevtools initialIsOpen={false} position='bottom-right' />
    </QueryClientProvider>
  )
};

export default App;

What is React Query?

fetch

cache

synchronize and update

& Client State

Client State

Server State

Server State 

React Query's Goal

Client State

Server State

React Query

Why I Like React Query

import React, {useState} from 'react';
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import apiService  from '../utils/apiService';

const ProductsRQ = () => {
    const { data: products, isLoading } = useQuery(['products'], apiService.getProducts);
    const [ product, setProduct] = useState();
    const queryClient = useQueryClient() // gets the current client instance
    const { mutate } = useMutation(apiService.addProduct, {
        onSuccess: () => {
            queryClient.invalidateQueries(['products'])
          },
    });
    const addProduct = () => mutate(product);
   //......
};

export default ProductsRQ;

Mutation Data Invalidation

DevTools

Why I Like React Query

less code

retries

widely used

lots of  features out of the box

Even More

Why I Like React Query

"agressive and sane defaults"

deduping

¡Gracias!

Data Fetching Made Easy

By Daniel Mocan

Data Fetching Made Easy

  • 245