Как сделать хук из моего кода 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: строка; }' можно вызвать."

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
0
45
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Вы деструктурируете asPath из useRouter(); в первой строке, но затем возвращаете его внутри объекта во второй.

пытаться:

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

Ваша функция должна возвращать строку независимо от этого.

Следующая строка:

const getCurrentPath = useCurrentPath();

присваивает результат вызова useCurrentPath константе getCurrentPath. Этот результат, основанный на вашем хуке, является либо string, либо объектом типа { asPath: string }.

Этот результат не является функцией и, следовательно, не может быть вызван. И вы вызываете это внутри JSX - в isActive атрибуте <SubHeaderLink />).

Вы, вероятно, имели в виду:

const getCurrentPath = useCurrentPath

, потому что useCurrentPath вызывается. Или, альтернативно:

const getCurrentPath = () => useCurrentPath()

Другая проблема заключается в том, что вы не всегда возвращаете string из своего пользовательского хука.
Я считаю, что вы должны заменить return { asPath } на return asPath внутри вашего хука, чтобы хук всегда возвращал string, что, скорее всего, вам и нужно.

Ответ принят как подходящий

Проблема в том, что вы возвращаете строку/объект из своего хука, а затем пытаетесь вызвать его как функцию.

Незначительные изменения, я бы предложил:

  1. Вы должны возвращать строку из своего хука. Возвращайте 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. Используйте строку напрямую вместо того, чтобы пытаться вызвать объект/строку, что и вызывает ошибку.
        <SubHeaderLink
          key = {_uid}
          href = {getHref(href)}
          name = {linkName}
          isActive = { getCurrentPath === getHref(href)}
        />

Другие вопросы по теме