React之Nextjs & react-query

790 阅读3分钟

本文已参与「 新人创作礼 」活动,一起开启掘金创作之路

关于如何进行图片优化 - 适合的才是最好的

看标题就知道我今天要讲的就是React技术栈体系的,基于Nextjs中的react-query的应用。

其实我看这个东西也就1天时间,当然可能讲的不是很透彻。

但是就react-query我还是想提供下学习的建议。

或许很多人也不知道react-query为何物,我当时的第一感觉是react-query是一个基于react的query查询组件。但是起名感觉又怪怪的。

也是新公司的历史项目用到的就有React Query 。

新项目框架我负责搭建:但是在技术栈的路线上还是要跟公司的主体保持一致性。

如果你用过Redux,或许你就会感受到React Query , 他其实是一个全家桶。在Redux,他其实是个数据管理的方式,他中间配套很多中间件例如 ( thunk、Saga、mobox )等等。

而React-query的强大就在于,他这个库,统统把你想到的都配齐了。

让我欣喜的是,他机会考虑到Saga里面的请求处理,合并。( Saga其实还是有些晦涩难懂 )

而React-query那就是开箱即用。一般业界对他的描述是:React-query为 React 缺少的数据获取(data-fetching)库,但是从更广泛的角度来看,它使 React 程序中的获取,缓存,同步和更新服务器状态变得轻而易举。

在中文翻译文档中有这样的一个介绍:

远程保留在您无法控制或拥有的位置

需要异步 API 进行获取和更新

意味着共享所有权,可以在你不知情的情况下被其他人改变

如果不小心,可能会在应用中变得"过时"

一旦你掌握了应用中服务器状态的本质,你会遇到更多的挑战,例如:

缓存...(这可能是编程中最难的事情)

将对同一数据的多个请求重复数据集合到单个请求中

在后台更新"过时"的数据

知道数据何时"过时"

尽可能快地反映数据更新

分页和延迟加载数据等性能优化

管理服务器状态的内存和 GC

结构化共享并存储查询结果

至于代码方面先放出最为简单的配置:

import { AppProps } from 'next/app';
import {
  QueryClient,
  QueryClientProvider,
} from 'react-query';
let defaultOptions = {
  queries:{
    /*
    staleTime 重新获取数据的时间间隔 默认0 , Infinity 永不过期
    cacheTime 数据缓存时间 默认 1000 * 60 * 5 5分钟
    retry 失败重试次数 默认 3次
    refetchOnWindowFocus 窗口重新获得焦点时重新获取数据 默认 false
    refetchOnReconnect 网络重新链接
    refetchOnMount 实例重新挂载
    enabled 如果为“false”的化,“useQuery”不会触发,需要使用其返回的“refetch”来触发操作
    */
  },//查询配置
  //mutations:{} 用来更新的配置
};
const dexerQueryClient = new QueryClient({
  defaultOptions
}); //默认QueryClient可以为空
//你也可以配置一些通用的处理参数  defaultOptions 如上

function MyApp({
  Component,
  pageProps
}:AppProps){
  return (
    <QueryClientProvider client={queryClient}>
      <Component {...pageProps} />
    </QueryClientProvider>
  )
}



//第一种写法
import { useQuery } from 'react-query';
import { NextPage } from 'next';
import React, { PureComponent, useContext } from 'react';
const Home: NextPage = () => {
  const { data } = useQuery('repoData', () =>
      fetch('https://api.github.com/repos/tannerlinsley/react-query').then((res) => res.json()),
  );
  return (
    <div>
      <h1>{data.name}</h1>
    </div>
  )
}

//第二种写法  ( 实现了按需加载的逻辑 )
import { useQuery } from 'react-query';
import { NextPage } from 'next';
import React, { PureComponent, useContext } from 'react';
const Home: NextPage = () => {
  const { refetch , data={} } = useQuery('repoData', () =>
      fetch('https://api.github.com/repos/tannerlinsley/react-query').then((res) => res.json()), { enabled: false,}
  );
  return (
    <div>
      <button onClick={refetch}>更新</button>
      <h1>{data.name}</h1>
    </div>
  )
}

其实详细的中文API文档大家可以参考这里。点击这里

PS:react-query 库的设计还是挺人性化的,他其实在性能上为初级工程师提供很多的边界处理,只要你考虑的到,比较适合于业务型的系统开发,如果有非常的极致性能,一级庞大的数据通信细腻度。react-query未必是最好的。还是一句话,存在即合理,合适的才是最好的!我也是探索react-query的路上,等我理解的更深刻的时候,或许我会在补充一篇。