Следующий JS, у React есть дочерний компонент, указывающий родителю, что отображать

#reactjs #routes #next.js

#reactjs #маршруты #next.js

Вопрос:

Я новичок в NextJS и React и хочу создать некоторую динамическую маршрутизацию. У меня есть родительская страница, которая вызывает дочерний компонент, который показывает некоторую навигацию.

В моем родительском компоненте у меня есть макет, который включает заголовок и правую боковую панель, которые будут отображаться на каждой странице, но в зависимости от ссылки, которая нажата в моем навигационном компоненте, содержимое тела изменится.

Мой родительский компонент:

 import React from 'react';

import { Header } from './Header;
import { SubNav } from './SubNav;
import { Sidebar } from './Sidebar;

export const AboutPage = () => {
  return (
    <>
      <Header />
      <SubNav />

      <div className="content">
        >>>I want to do something like this <<<
        {section === history amp;amp; <History />}
        {section === contact amp;amp; <Contact />}
          .....
      </div>

      <Sidebar />
    </>
  );
};
  

В моем дочернем навигационном компоненте я сопоставляю некоторые данные, которые включают «значение» для каждого отдельного раздела, который я определил в массиве.

 <NavButtons
  onClick={() => {
    const path = AppRoute.ABOUT.replace(':section', 'value');
    router.push(path, path, { shallow: true });
  }}
/>

  

Страница правильно маршрутизируется со значением раздела, изменяющимся каждый раз, когда я нажимаю на другую кнопку навигации, но я не могу изменить содержимое в родительском компоненте, я попытался создать функцию в родительском компоненте, которая получит значение от дочернего элемента, чтобы я мог использовать его для определения значения раздела.разделы в родительском, но в конечном итоге создается бесконечный цикл. Запутался в том, как заставить их работать вместе.

Комментарии:

1. используйте государственную библиотеку. Например, redux (немного излишне). может быть zustand

Ответ №1:

Вы можете определить путь с useRouter помощью хука. Затем вы можете проверить в инструкции switch case, на каком сайте находится пользователь, и отобразить компоненты для маршрута.

 import { useRouter } from next/router
  

Внутри компонента

 const router = useRouter();
  

Функция для возврата компонента

 function renderSidebar(pathname){
switch(pathname){
...
}
  

Внутри функции визуализации

 { renderSidebar(router.pathname) }
  

Смотрите дальнейшее использование в документах
NextJS https://nextjs.org/docs/api-reference/next/router

Ответ №2:

         import React from 'react';
        import {useState} from 'react';
        import { Header } from './Header';
        import { SubNav } from './SubNav';
        import { Sidebar } from './Sidebar';
        
        export const AboutPage = () => {
            const [section,setSection] = useState()
            sectionHandler = (section) => {
             setSection(section)
            }
          return (
            <>
              <Header />
              <SubNav />
        
              <div className="content">
                >>>I want to do something like this <<<
                {section === history amp;amp; <History />}
                {section === contact amp;amp; <Contact />}
                  .....
              </div>
        
              <Sidebar />
            </>
          );
        };
    
  

и в вашем дочернем компе

      <NavButtons
      onClick={() => {
        const path = AppRoute.ABOUT.replace(':section', 'value');
        props.sectionHandler(section)
        router.push(path, path, { shallow: true });
      }}
     />
  

не забудьте передать sectionhandler от родительского к дочернему компоненту

Комментарии:

1. В итоге я реализовал это с помощью {useState} и отлично сработал, спасибо