Страница Гэтсби на странице

Я использую gatsby js и пытаюсь понять, как создать боковую панель на уровне страницы со ссылками на Gatsby, которые отображают новый компонент внутри div на той же странице. Я могу сделать это с помощью response-router-dom, но в Gatsby все, что я могу. find - это то, как создавать сообщения в блогах, которые сводят меня с ума, поскольку каждый учебник, который я нахожу, представляет собой одно и то же сообщение в блоге.

Страница Гэтсби на странице

Вот моя страница макета /layouts/index.js

export default ({ children }) => (
  <div id = "layout">
    <header>
      <h3>Header</h3>
      <MainNav />
    </header>
    {children()}
  </div>
)

О странице /pages/about.js

export default ({ location, match }) => {
  console.info('location = ', location, 'match = ', match );
  return (
    <div id = "about">
      <SideBar />
      <div id = "content">
        // . add child template or component for link clicked in sidebar
      </div>
    </div>
  );
};

То, что я пытаюсь сделать, - это когда пользователь нажимает ссылку на боковой панели, оставаясь включенным, но отображая новый компонент или шаблон на основе ссылки gatsby, нажатой на боковой панели about.

Компонент About SideBar /components/about/side-bar.js

const SideBar = () => {
  return (
    <div id = "side-bar">
      {/* <li><Link to='/about?sort=name'>work</Link></li> */}
      <li><Link to = "/about/work">work</Link></li>
      <li><Link to='/about/hobbies'>hobbies</Link></li>
      <li><Link to='/about/buildings'>buildings</Link></li>
    </div>
  )
}

Проблема со ссылками выше, они пытаются перейти на новую страницу с именем. /о работе Это не то, что я пытаюсь сделать. Опять же, я пытаюсь сделать так, чтобы он оставался на месте, но рендерил новый компонент внутри div содержимого.

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

Обновлено: Я попытался добавить страницу в суд с createPage, которая работает для меня, но не передает идентификатор match.params

gatsby-node.js

exports.createPages = ({ boundActionCreators }) => {
  const { createPage } = boundActionCreators;
  const myComponent = path.resolve('src/pages/about/index.js');
  createPage({
    path: '/about/:id',
    component: myComponent
  })
}

Передайте какие-то реквизиты <SideBar location = {location} match = {match}/> и используйте их - ищите «условный рендеринг»?

xadm 18.08.2018 21:48

Спасибо xadm, но это местоположение отобразит новую страницу. Я пытаюсь не отображать новую страницу. Вместо этого я хочу отобразить шаблон нового компонента внутри <div id = "content"> на той же странице about.

me-me 18.08.2018 22:10

компоненты роутера "переключают" на разные маршруты. Если маршрут не используется, чем изменить значение в локальном состоянии, передайте его как опору в оба компонента (SideBar и Content). Внутри них рендерит условно то, что нужно.

xadm 18.08.2018 22:24

Извините, я не понимаю, что вы говорите. Gatsby Link использует скрытые маршруты, в этом вся его цель. Я хочу использовать Route, чтобы пользователь мог перемещаться в браузере вперед и назад. Использование локального состояния не приведет к такому поведению маршрута.

me-me 18.08.2018 22:28

Маршруты всегда будут отображать всю страницу, а не подкомпонент, но вы можете использовать общие макеты (более сложную структуру, чем один компонент) при визуализации каждой «точки входа».

xadm 18.08.2018 22:50

Просто клонируйте about.js и обновляйте контент для всех подмаршрутов. React минимизирует изменения - это будет выглядеть как изменение только подкомпонента / div содержимого. Но вы можете настроить боковую панель, отметить активный выбор и т. д.

xadm 18.08.2018 23:11

Как я уже сказал, ты потерял меня. У вас есть пример того, что вы имеете в виду?

me-me 18.08.2018 23:30

С реактивным куполом маршрутизатора я мог бы сделать что-то вроде. <Route path = '/ roster /: id' component = {about} />, тогда я мог бы получить значение id в реквизитах match.params и отобразить правильный компонент внутри моего <div id = "content">

me-me 18.08.2018 23:33

Я только что добавил обновление, используя gatsby-node.js, но оно по-прежнему не передает / roster /: id в match.params

me-me 18.08.2018 23:46

посмотрите на (витрину Гэтсби) вдохновение: angeloocana.com/en/resume/education> angeloocana.com/en/resume/languages

xadm 19.08.2018 00:02

Ты снова потерял меня по этой ссылке ??

me-me 19.08.2018 00:10

Это пример общего маршрута / подмаршрутов / компоновки - источники на github

xadm 19.08.2018 00:12

Я не вижу ничего отдаленно похожего на то, что мне нужно в моем примере изображения, но все же интересная ссылка, спасибо

me-me 19.08.2018 00:28

меню в нижнем колонтитуле похоже на подменю на боковой панели; ResumeContainer - это общий макет для всех маршрутов resume.

xadm 19.08.2018 00:36

Спасибо за помощь, но я не вижу, как ResumeContainer делает то, что я пытаюсь сделать. Так что, если у кого-то есть другие идеи или быстрый пример, я был бы признателен.

me-me 19.08.2018 01:09

Он содержит меню (использует ссылку из gatsby-link), переданное как свойство. EducationsPage (и другие) связаны из главного меню (как маршрутизатор). . Для нижнего колонтитула используется собственная структура меню (ее сложно создать, просто используйте общий массив объектов), передаваемую в контейнер (ваш макет с боковой панелью). Образование - это контент (используется в контейнере как {props.children}). Этот {props.children} похож на заполнитель содержимого в шаблоне.

xadm 19.08.2018 09:02
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
5
16
1 342
1

Ответы 1

После долгих попыток понять Гэтсби, я могу сказать, что до сих пор не понимаю, поскольку его документы обширны и не очень ясны. Но как только я начал смотреть на node-apis и onCreatePage, это дало мне несколько идей. Об этом буквально говорят документы.

onCreatePage

Called when a new page is created. This extension API is useful for programmatically manipulating pages created by other plugins e.g. if you want paths without trailing slashes.

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

В любом случае, это заставило меня написать хоть какой-то код. Затем, примерно через 3 часа, я нашел плагин, который делал именно то, что я пытался сделать с помощью этого метода. Плагин называется gatsby-plugin-create-client-paths ключ, здесь клиентские пути !!!!!

This makes life worth living! So in my case above I just wanted to be able to use Gatsby's router ( which is just react-router-dom behind the scenes), to pass me and id or value to routers match.params object. It still doesn't but what it does do is checks for any path after a prefix like /folder/ в моем случае '/о работе и воссоздайте страницу с компонентом шаблона (в моем случае продолжайте использовать pages / about / index.js), который является моим шаблоном. Теперь, когда у нас есть рендеринг about / index.js для любой ссылки после / about /, мы можем использовать некоторый внутренний оператор switch для обработки местоположения, переданного в /about/index.js. По-прежнему не получаю обновление match.params, но получаю props.location.pathname; что позволяет мне извлекать все, что находится после префикса, для использования в операторе switch для рендеринга моих конкретных компонентов на основе имени пути маршрута. Достаточно кроликов здесь - это грубое решение, которое можно показать в качестве примера.

Так что добавьте плагин как npm install. откройте gatsby.config.js и добавьте в экспорт приведенный ниже код.

module.exports = {
  plugins: [
    {
      resolve: `gatsby-plugin-create-client-paths`,
      options: { prefixes: [`/about/*`] },
    },
  ]
} 

Тогда в моей главной странице о pages/about/index

import React from "react";
import SideBar from '../../components/about/side-nav';

export default (props) => {
  const { pathname } = props.location;
  var n = pathname.lastIndexOf('/');
  var pageId = pathname.substring(n + 1);

  const page = () => {
    switch(pageId){
      case '': 
        return (
          <div>Work Page</div>
        );
      case 'work':
        return (
          <div>Work Page</div>
        );
      case 'hobbies':
        return (
          <div>Hobbies Page</div>
        );
      case 'buildings':
      return (
        <div>buildings Page</div>
      );
    }
  }
  return (
    <div id = "about">
      <SideBar />
      <div id = "content">
        {page()}
      </div>
    </div>
  );
};

Затем на боковой панели я называю это так.

  <li><Link to = "/about/work">work</Link></li>
  <li><Link to='/about/hobbies'>hobbies</Link></li>
  <li><Link to='/about/buildings'>buildings</Link></li>

Надеюсь, это поможет кому-то другому. После всего этого я начинаю серьезно сомневаться в большей части Гэтсби, особенно с не очень ясной документацией. Основываясь на ответе на мой вопрос, я думаю, что не многие люди в сообществе stackoverflow используют Gatsby, что беспокоит вас, когда вам нужна помощь. Похоже, что сообщество Gatsby на github очень полезно, но это должно быть для проблем с ошибками, а не для таких вопросов, как мой, но обнадеживает.

Надеюсь, это кому-то поможет.

Я собирался задать новый вопрос об этой конкретной ситуации, но ваш ответ сработал идеально - спасибо!

Dmitriy 29.12.2018 17:57

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