1

我想将变量添加到使用 graphql 请求获取的 swr 中。这是我的代码

import { request } from "graphql-request";
import useSWR from "swr";

const fetcher = (query, variables) => request(`https://graphql-pokemon.now.sh`, query, variables);

export default function Example() {
  const variables = { code: 14 };
  const { data, error } = useSWR(
    `query GET_DATA($code: String!) {
                getRegionsByCode(code: $code) {
                  code
                  name
                }
              }`,
    fetcher
  );

  if (error) return <div>failed to load</div>;
  if (!data) return <div>loading...</div>;
  return <pre>{JSON.stringify(data, null, 2)}</pre>;
}

但我不知道如何添加variables到 swr fetcher 中,因为我知道useSWR(String, fetcher)string 用于查询,而 fetcher 用于 fetch 函数,我可以将变量放在哪里?

4

3 回答 3

7

您可以使用Multiple Arguments,您可以使用数组作为反应钩子的key参数。useSWR

import React from "react";
import { request } from "graphql-request";
import useSWR from "swr";

const fetcher = (query, variables) => {
  console.log(query, variables);
  return request(`https://graphql-pokemon.now.sh`, query, variables);
};
export default function Example() {
  const variables = { code: 14 };
  const { data, error } = useSWR(
    [
      `query GET_DATA($code: String!) {
          getRegionsByCode(code: $code) {
            code
            name
          }
        }`,
      variables,
    ],
    fetcher
  );

  if (error) return <div>failed to load</div>;
  if (!data) return <div>loading...</div>;
  return <pre>{JSON.stringify(data, null, 2)}</pre>;
}

该函数fetcher仍然接受相同的 2 个参数:queryvariables.

于 2021-01-04T12:24:16.953 回答
2

SWR作者在这里!

同意这是一个关键特性,这就是为什么从 v1.1.0 开始,SWR 密钥将自动稳定地序列化。所以你可以安全地这样做:

useSWR(['query ...', variables], fetcher)

Whilevariables可以是 JavaScript 对象(可以是嵌套的,也可以是数组),并且不会导致任何不必要的重新渲染。此外,序列化过程是稳定的,因此以下键是相同的,没有额外的请求:

// Totally OK to do so, same resource!
useSWR(['query ...', { name: 'foo', id: 'bar' }], fetcher)
useSWR(['query ...', { id: 'bar', name: 'foo' }], fetcher)

您也可以直接将对象作为键传递,它将被传递给 fetcher:

useSWR(
  {
    query: 'query ...',
    variables: { name: 'foo', id: 'bar' }
  },
  fetcher
)

您可以通过安装最新版本的 SWR 来尝试一下,如果有任何问题,请告诉我 :)

于 2021-11-30T16:34:10.730 回答
0

slideshowp2的解决方案对我没有帮助,因为它导致了无限循环。

不要将对象传递给useSWR函数,因为它们在每次重新渲染时都会改变。直接传递变量:

const fetcher = (query, variables) => {
  console.log(query, variables);
  return request(`https://graphql-pokemon.now.sh`, query, variables);
};
export default function Example() {
  const { data, error } = useSWR(
    [
      `query GET_DATA($code: String!) {
          getRegionsByCode(code: $code) {
            code
            name
          }
        }`,
      14,
    ],
    (query, coder => fetcher(query, { code })
  );

  if (error) return <div>failed to load</div>;
  if (!data) return <div>loading...</div>;
  return <pre>{JSON.stringify(data, null, 2)}</pre>;
}
于 2021-10-16T18:12:37.533 回答