zoukankan      html  css  js  c++  java
  • xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!

    React Query & SWR

    HTTP request all in one solution

    React Query

    Hooks for fetching, caching and updating asynchronous data in React

    https://react-query.tanstack.com/

    https://github.com/tannerlinsley/react-query

    /* eslint-disable jsx-a11y/anchor-is-valid */
    import React from "react";
    import ReactDOM from "react-dom";
    import axios from "axios";
    import {
      useQuery,
      useQueryCache,
      QueryCache,
      ReactQueryCacheProvider,
    } from "react-query";
    import { ReactQueryDevtools } from "react-query-devtools";
    
    const queryCache = new QueryCache();
    
    function App() {
      const [postId, setPostId] = React.useState(-1);
    
      return (
        <ReactQueryCacheProvider queryCache={queryCache}>
          <p>
            As you visit the posts below, you will notice them in a loading state
            the first time you load them. However, after you return to this list and
            click on any posts you have already visited again, you will see them
            load instantly and background refresh right before your eyes!{" "}
            <strong>
              (You may need to throttle your network speed to simulate longer
              loading sequences)
            </strong>
          </p>
          {postId > -1 ? (
            <Post postId={postId} setPostId={setPostId} />
          ) : (
            <Posts setPostId={setPostId} />
          )}
          <ReactQueryDevtools initialIsOpen />
        </ReactQueryCacheProvider>
      );
    }
    
    function usePosts() {
      return useQuery("posts", async () => {
        const { data } = await axios.get(
          "https://jsonplaceholder.typicode.com/posts"
        );
        return data;
      });
    }
    
    function Posts({ setPostId }) {
      const cache = useQueryCache();
      const { status, data, error, isFetching } = usePosts();
    
      return (
        <div>
          <h1>Posts</h1>
          <div>
            {status === "loading" ? (
              "Loading..."
            ) : status === "error" ? (
              <span>Error: {error.message}</span>
            ) : (
              <>
                <div>
                  {data.map((post) => (
                    <p key={post.id}>
                      <a
                        onClick={() => setPostId(post.id)}
                        href="#"
                        style={
                          // We can use the queryCache here to show bold links for
                          // ones that are cached
                          cache.getQueryData(["post", post.id])
                            ? {
                                fontWeight: "bold",
                                color: "green",
                              }
                            : {}
                        }
                      >
                        {post.title}
                      </a>
                    </p>
                  ))}
                </div>
                <div>{isFetching ? "Background Updating..." : " "}</div>
              </>
            )}
          </div>
        </div>
      );
    }
    
    const getPostById = async (key, id) => {
      const { data } = await axios.get(
        `https://jsonplaceholder.typicode.com/posts/${id}`
      );
      return data;
    };
    
    function usePost(postId) {
      return useQuery(["post", postId], getPostById, {
        enabled: postId,
      });
    }
    
    function Post({ postId, setPostId }) {
      const { status, data, error, isFetching } = usePost(postId);
    
      return (
        <div>
          <div>
            <a onClick={() => setPostId(-1)} href="#">
              Back
            </a>
          </div>
          {!postId || status === "loading" ? (
            "Loading..."
          ) : status === "error" ? (
            <span>Error: {error.message}</span>
          ) : (
            <>
              <h1>{data.title}</h1>
              <div>
                <p>{data.body}</p>
              </div>
              <div>{isFetching ? "Background Updating..." : " "}</div>
            </>
          )}
        </div>
      );
    }
    
    const rootElement = document.getElementById("root");
    ReactDOM.render(<App />, rootElement);
    
    
    

    SWR

    React Hooks library for data fetching

    https://swr.vercel.app/

    // fetcher
    
    export function fetcher() {
      return fetch(`${process.env.REACT_APP_API_BASE_URL}users`).then(response =>
        response.json()
      );
    }
    
    
    
    
    import useSWR from 'swr';
    
    function Profile() {
      const { data, error } = useSWR('/api/user', fetcher)
      if (error) return <div>failed to load</div>
      if (!data) return <div>loading...</div>
      return <div>hello {data.name}!</div>
    }
    
    

    demo

    https://codesandbox.io/s/4-ways-to-handle-restful-http-in-react-41j83

    https://codesandbox.io/s/react-query-hooks-ss7o0

    https://www.dataformsjs.com/examples/countries-no-spa-react.htm

    refs

    https://codesandbox.io/s/4-ways-to-handle-restful-http-in-react-k3xug

    https://codesandbox.io/s/github/tannerlinsley/react-query/tree/master/examples/basic?from-embed



    ©xgqfrms 2012-2020

    www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!


  • 相关阅读:
    设计模式学习心得5
    HTTP协议 (六) 状态码详解
    HTTP协议 (五) 代理
    HTTP协议 (四) 缓存
    HTTP协议 (三) 压缩
    HTTP协议 (二) 基本认证
    HTTP协议 (一) HTTP协议详解
    java中abstract和interface的區別(轉)
    基于TCP的字符串传输程序
    文件比较
  • 原文地址:https://www.cnblogs.com/xgqfrms/p/13938962.html
Copyright © 2011-2022 走看看