小编ent*_*one的帖子

如何清除/删除 NextJs 中的缓存?

我有一个产品页面/products/[slug].js

我对 wordpress/graphql 站点使用增量静态生成:

export async function getStaticProps(context) {

    const {params: { slug }} = context

    const {data} = await client.query(({
        query: PRODUCT_SLUG,
        variables: { slug }
    }));

    return {
        props: {
            categoryName: data?.productCategory?.name ?? '',
            products: data?.productCategory?.products?.nodes ?? []
        },
        revalidate: 1
    }

}

export async function getStaticPaths () {
    const { data } = await client.query({
        query: PRODUCT_SLUGS,
    })

    const pathsData = []

    data?.productCategories?.nodes && data?.productCategories?.nodes.map((productCategory) => {
        if (!isEmpty(productCategory?.slug)) {
            pathsData.push({ params: { slug: productCategory?.slug } …
Run Code Online (Sandbox Code Playgroud)

wordpress caching apollo next.js

39
推荐指数
2
解决办法
12万
查看次数

为什么使用react-query库中的useQueryClient?

在react-query的快速入门文档中,以下示例:

// Create a client
const queryClient = new QueryClient();

const App = function () {
  return (
    // Provide the client to your App
    <QueryClientProvider client={ queryClient }>
      <Todos />
    </QueryClientProvider>
  );
};

const Todos = function () {

  // Access the client
  const queryClient = useQueryClient();

  // ...

  return (
    <>
      ...
    </>
  );
};
Run Code Online (Sandbox Code Playgroud)

但我不明白为什么我应该在 Todos 中使用 useQueryClient 挂钩。

// Access the client
const queryClient = useQueryClient();
Run Code Online (Sandbox Code Playgroud)

我的意思是我不能queryClient从主文件中导出实例:

// App.js
export const queryClient …
Run Code Online (Sandbox Code Playgroud)

reactjs react-context react-hooks react-query

12
推荐指数
2
解决办法
1万
查看次数

为什么打字稿不能正确推断 T[K] 与 &lt;T extends Person, K extends keyof T&gt; generic?

我创建了一个 React 钩子:

\n
interface Person {\n    name: string\n    age: number\n}\n\nexport const usePerson = function <T extends Person, K extends keyof T>(): (property: K, setter: (value: T[K]) => T[K]) => void {\n\n    const setPersonProperty = (property: K, setter: (value: T[K]) => T[K]): void => {\n        console.log(property, setter)\n    }\n\n    setPersonProperty(\'name\', (x) => x)\n\n    return setPersonProperty;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我已经从打字稿文档中看到了该模式<T, K extends keyof T>,但我无法在我的示例中正确使用它。

\n

更具体地说,打字稿在线抱怨

\n
setPersonProperty(\'name\', (x) => x)\n
Run Code Online (Sandbox Code Playgroud)\n

虽然当我开始输入setPersonProperty(\'n /* IDE autocompletes name */但抱怨参数时\'name\',我收到以下错误: …

typescript reactjs typescript-generics react-hooks react-typescript

7
推荐指数
1
解决办法
483
查看次数

为什么打字稿抱怨 XXX 可分配给类型“T”的约束,但“T”可以用约束 X 的不同子类型实例化?

我的代码是这样的:

\n
export interface TreeItem {\n  id: string;\n  children: this[];\n  collapsed?: boolean;\n}\n\nconst createTreeItem = <T extends TreeItem>(): T => {\n  return {\n    id: 'root',\n    children: []\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

但我收到一个错误,其返回类型createTreeItem如下:

\n
\n

TS2322: 类型“ { id: string; children: never[]; }”不可分配给\n类型“ T”。\xc2\xa0\xc2\xa0' { id: string; children: never[]; }' 可分配给\n类型“ ”的约束T,但“ T”可以使用不同\n约束子类型' 进行实例化TreeItem

\n
\n

我完全不知道这是什么意思。

\n

有什么帮助吗?

\n

javascript interface typescript typescript-generics

6
推荐指数
1
解决办法
1035
查看次数

如何正确使用axios拦截器和typescript?

我创建了一个 axios 拦截器:

instance.interceptors.response.use(async (response) => {
    return response.data;
  }, (err) => {
    return Promise.reject(err);
  });
Run Code Online (Sandbox Code Playgroud)

它获取response并返回该data属性。

对象response是类型的AxiosResponse<any, any>data属性只是类型的数据AxiosResponse<any, any>.data

问题是当我使用这个 axios 客户端时

const instance = axios.create({...});
// ...etc
// add interceptor
Run Code Online (Sandbox Code Playgroud)

然后我这样做:

customAxiosClient.get().then((data: /* here data is of type AxiosResponse instead of AxiosResponse.data */)
Run Code Online (Sandbox Code Playgroud)

如何解决这个问题?

javascript types interceptor typescript axios

5
推荐指数
1
解决办法
2万
查看次数

Lodash _.debounce 与队列组合?

有没有办法保留调用去抖函数的所有参数,将它们保存在队列中,然后触发单个批处理操作?

例如:

const debounceWithQueue = _.debounce(myFn, 1000);
Run Code Online (Sandbox Code Playgroud)
debounceWithQueue(1);
debounceWithQueue(2);
debounceWithQueue(3);
Run Code Online (Sandbox Code Playgroud)

一秒钟过去后,我希望我的函数myFn使用参数执行[1, 2, 3]

myFn([1, 2, 3]);
Run Code Online (Sandbox Code Playgroud)

另外,如果 1 秒过去队列达到一定大小,是否可以触发(记录 debounceWithQueue 函数被调用的次数)

javascript queue debouncing lodash

4
推荐指数
1
解决办法
1737
查看次数

重命名反应钩子属性的好习惯?

我使用反应库前。react-query。这个库提供了一个钩子useQueryex。

const {data, isLoading} = useQuery(['users'], userService.getUsers);
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果我想使用两个useQuery钩子,以避免重复的命名变量:

data, isLoading
Run Code Online (Sandbox Code Playgroud)

我必须做这样的事情:

const users = useQuery(['users'], userService.getUsers);
const products = useQuery(['products'], userService.getProducts);

...
// then use
users.data, users.isLoading
// and
products.data, products.isLoading
...
Run Code Online (Sandbox Code Playgroud)

为了使这个逻辑更加一致,我尝试制作自己的自定义挂钩并重命名useQuery内部提供的属性,以便我可以使用扩展语法进行访问。

function useGetUsers(){
    const {data, isLoading} = useQuery(['users'], userService.getUsers);
    return {
        usersData: data,
        isUsersLoading: isLoading
    }
}
Run Code Online (Sandbox Code Playgroud)

和产品一样。

现在,我可以将前面的示例写为:

const {usersData, isUsersLoading} = useGetUsers();
const {productsData, isProductsLoading} = useGetProducts();
Run Code Online (Sandbox Code Playgroud)

当然,为了拥有所有的键,我迭代了useQuery钩子提供的所有键,并用我自己的驼峰大小写规则等定制了我自己的自定义键。

我的问题是,这样可以吗?我的意思是,这被认为是一个好的做法还是只是符合users.isLoading逻辑?

javascript properties dynamically-generated reactjs react-hooks

2
推荐指数
1
解决办法
5300
查看次数