如何从我的代码 React.js/Next.js 中创建一个钩子?

How to make a hook from my code React.js/Next.js?

我尝试从我的代码中创建一个钩子,但我遇到了问题。 我的挂钩文件代码:

    import { useRouter } from "next/router";


    const useCurrentPath = () => {
    const { asPath, locale, defaultLocale } = useRouter();
    if (locale === defaultLocale) return { asPath };

    return `/${locale}${asPath}`;  
    };

    export default useCurrentPath; 

我叫它的地方

import { SubHeaderLink, SubHeaderLinks } from "@/components/layout/subHeader/SubHeader";
import { ReactStoryblokComponent, StoryblokLink } from "@/types/storyblok";
import { useStoryblokLinkParser } from "storyblok/useStoryblokLinkParser";
import useCurrentPath from "hooks/useCurrentPath";

type Blok = {
  subHeaderLinks: { _uid: string; linkName: string; href: StoryblokLink }[];
};

const StoryblokSubHeader: ReactStoryblokComponent<Blok> = ({
  blok: { subHeaderLinks },
}) => {
  const { getHref } = useStoryblokLinkParser();
  const getCurrentPath = useCurrentPath();

  return (
    <SubHeaderLinks>
      {subHeaderLinks.map(({ _uid, href, linkName }) => (
        <SubHeaderLink
          key={_uid}
          href={getHref(href)}
          name={linkName}
          isActive={ getCurrentPath() === getHref(href)}
        />
      ))}
      ))
    </SubHeaderLinks>
  );
};

export default StoryblokSubHeader;

isActive={ getCurrentPath() === getHref(href)}

我遇到了“此表达式不可调用。 'string | { asPath: string; }' 类型的成分不可调用。"

const { asPath, locale, defaultLocale } = useRouter();
if (locale === defaultLocale) return { asPath };

您在第一行从 useRouter(); 解构 asPath,然后在第二行 return 将其放入一个对象中。

尝试:

const { asPath, locale, defaultLocale } = useRouter();
if (locale === defaultLocale) return asPath;

无论如何,您的函数都应该 return 一个字符串。

下一行:

const getCurrentPath = useCurrentPath();

将调用 useCurrentPath 的结果分配给 getCurrentPath 常量。根据您的钩子,该结果是 string{ asPath: string }.

类型的对象

该结果不是函数,因此不可调用。你在 JSX 中调用它 - 在 <SubHeaderLink />).

isActive 属性中

你的意思可能是:

const getCurrentPath = useCurrentPath

,因为 useCurrentPath 是可调用的。或者,或者:

const getCurrentPath = () => useCurrentPath()

另一个问题是您并不总是从自定义挂钩中返回 string
我相信你应该在你的钩子里面用 return asPath 替换 return { asPath },所以钩子总是 returns 一个 string,这很可能是你想要的。

问题是您从挂钩返回 string/object,然后尝试将其作为函数调用。

小改动,我建议:

  1. 您应该从钩子中返回一个字符串。 Return asPath 而不是对象。
    import { useRouter } from "next/router";


    const useCurrentPath = () => {
    const { asPath, locale, defaultLocale } = useRouter();
    if (locale === defaultLocale) return asPath;

    return `/${locale}${asPath}`;  
    };

    export default useCurrentPath; 

  1. 直接使用字符串而不是尝试调用 object/string,这是导致错误的原因。
        <SubHeaderLink
          key={_uid}
          href={getHref(href)}
          name={linkName}
          isActive={ getCurrentPath === getHref(href)}
        />