Задать вопрос
exxxcitation1
@exxxcitation1
Ваше Эникейшество

Почему не отображается шторка при изменении ссылки?

Есть код страницы, на которой отрисовывается шторка:

import { FC } from "react";
import { uniqueId } from "lodash";
import { ActionColumn } from "src/features/ui";
import {
  ListTemplateStyled,
  PageGridStyled,
  PageHeader,
  ContentGridStyled,
  Curtain,
} from "src/shared/ui";
import { TEAMS_PAGE_TITLE } from "../constants";
import { Group } from "./Group";
import { TeamsPage } from "src/routes";
import { useSearchParams } from "src/shared/hooks";

const counterMock = { title: "Команды", entire: 32, current: 12 };
const teamsMock = [
  { name: "Команда 1" },
  { name: "Команда 1" },
  { name: "Команда 1" },
  { name: "Команда 1" },
  { name: "Команда 1" },
  { name: "Команда 1" },
  { name: "Команда 1" },
  { name: "Команда 1" },
  { name: "Команда 1" },
  { name: "Команда 1" },
  { name: "Команда 1" },
  { name: "Команда 1" },
  { name: "Команда 1" },
  { name: "Команда 1" },
];

/** Страница со списком команд для участия в игре */
export const Teams: FC = () => {
  const searchParams = useSearchParams();
  const match = searchParams.has(TeamsPage.VIEW_CURTAIN);

  return (
    <PageGridStyled>
      <PageHeader title={TEAMS_PAGE_TITLE} />

      <ContentGridStyled>
        <ActionColumn
          title={counterMock.title}
          entire={counterMock.entire}
          current={counterMock.current}
        />

        <ListTemplateStyled>
          {teamsMock.map((team) => (
            <Group key={uniqueId()} name={team.name} />
          ))}
        </ListTemplateStyled>

        <Curtain open={match} path={TeamsPage.VIEW_CURTAIN} />
      </ContentGridStyled>
    </PageGridStyled>
  );
};


И есть код самое шторки:

import { FC } from "react";
import ReactDOM from "react-dom";
import { useCloseCurtain } from "src/shared/hooks";
import { CurtainProps } from "./interfaces";
import {
  BodyStyled,
  CloseIconBoxStyled,
  ContentStyled,
  GridStyled,
  OverlayStyled,
} from "./styles";
import { ReactComponent as CrossIcon } from "./svg/Cross.svg";

/** Шторка для просмотра и редактирования инфморациии элементов */
export const Curtain: FC<CurtainProps> = ({ open, path, children }) => {
  const handleClose = useCloseCurtain(path);

  return (
    <>
      {open &&
        ReactDOM.createPortal(
          <GridStyled data-testid="Curtain.Grid">
            <OverlayStyled data-testid="Curtain.Overlay">
              <CloseIconBoxStyled
                onClick={handleClose}
                data-testid="Curtain.CloseButton"
              >
                <CrossIcon data-testid="Curtain.CrossIcon" />
              </CloseIconBoxStyled>
            </OverlayStyled>

            <BodyStyled data-testid="Curtain.Body">
              <ContentStyled data-testid="Curtain.Content">
                {children}
              </ContentStyled>
            </BodyStyled>
          </GridStyled>,
          document.getElementById("root") as Element
        )}
    </>
  );
};


По нажатию определённой кнопки я меняю роут, добавляю в него гет параметр
Выглядит это, в итоге, вот так localhost:3000/teams?viewCurtain=true

При изменении ссылки шторка не отрисовывается, как я ожидал
Но если изначально вставить в адресную строку эту ссылку и перейти по ней, то шторка отобразится

Вместо serachParams, что есть:
export const useSearchParams = (): URLSearchParams => {
  const { search } = useLocation();

  return useMemo(() => new URLSearchParams(search), [search]);
};


переделывал на Router
Также не работает
Интересно сделать с помощью мэтча параметров

На работе есть аналогичный пример, но там всё прекрасно работает
Где то место, которое не даёт отрисоваться шторке сразу после изменения роута?

Учитывая то, что при удалении параметра, отвечающего за шторку, из ссылки через обработчик события, не руками - шторка успешно закрывается
  • Вопрос задан
  • 29 просмотров
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Frontend-разработка на React
    10 недель
    Далее
  • ProductStar
    Разработка на React
    6 недель
    Далее
  • Яндекс Практикум
    React-разработчик
    3 месяца
    Далее
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
от 250 000 до 300 000 ₽
ITK academy Нижний Новгород
от 50 000 до 90 000 ₽
ITK academy Екатеринбург
от 50 000 до 90 000 ₽