Я использую 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
})
}
Спасибо xadm, но это местоположение отобразит новую страницу. Я пытаюсь не отображать новую страницу. Вместо этого я хочу отобразить шаблон нового компонента внутри <div id = "content"> на той же странице about.
компоненты роутера "переключают" на разные маршруты. Если маршрут не используется, чем изменить значение в локальном состоянии, передайте его как опору в оба компонента (SideBar и Content). Внутри них рендерит условно то, что нужно.
Извините, я не понимаю, что вы говорите. Gatsby Link использует скрытые маршруты, в этом вся его цель. Я хочу использовать Route, чтобы пользователь мог перемещаться в браузере вперед и назад. Использование локального состояния не приведет к такому поведению маршрута.
Маршруты всегда будут отображать всю страницу, а не подкомпонент, но вы можете использовать общие макеты (более сложную структуру, чем один компонент) при визуализации каждой «точки входа».
Просто клонируйте about.js и обновляйте контент для всех подмаршрутов. React минимизирует изменения - это будет выглядеть как изменение только подкомпонента / div содержимого. Но вы можете настроить боковую панель, отметить активный выбор и т. д.
Как я уже сказал, ты потерял меня. У вас есть пример того, что вы имеете в виду?
С реактивным куполом маршрутизатора я мог бы сделать что-то вроде. <Route path = '/ roster /: id' component = {about} />, тогда я мог бы получить значение id в реквизитах match.params и отобразить правильный компонент внутри моего <div id = "content">
Я только что добавил обновление, используя gatsby-node.js, но оно по-прежнему не передает / roster /: id в match.params
посмотрите на (витрину Гэтсби) вдохновение: angeloocana.com/en/resume/education> angeloocana.com/en/resume/languages
Ты снова потерял меня по этой ссылке ??
Это пример общего маршрута / подмаршрутов / компоновки - источники на github
Я не вижу ничего отдаленно похожего на то, что мне нужно в моем примере изображения, но все же интересная ссылка, спасибо
меню в нижнем колонтитуле похоже на подменю на боковой панели; ResumeContainer - это общий макет для всех маршрутов resume.
Спасибо за помощь, но я не вижу, как ResumeContainer делает то, что я пытаюсь сделать. Так что, если у кого-то есть другие идеи или быстрый пример, я был бы признателен.
Он содержит меню (использует ссылку из gatsby-link), переданное как свойство. EducationsPage (и другие) связаны из главного меню (как маршрутизатор). . Для нижнего колонтитула используется собственная структура меню (ее сложно создать, просто используйте общий массив объектов), передаваемую в контейнер (ваш макет с боковой панелью). Образование - это контент (используется в контейнере как {props.children}). Этот {props.children} похож на заполнитель содержимого в шаблоне.





После долгих попыток понять Гэтсби, я могу сказать, что до сих пор не понимаю, поскольку его документы обширны и не очень ясны. Но как только я начал смотреть на 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 очень полезно, но это должно быть для проблем с ошибками, а не для таких вопросов, как мой, но обнадеживает.
Надеюсь, это кому-то поможет.
Я собирался задать новый вопрос об этой конкретной ситуации, но ваш ответ сработал идеально - спасибо!
Передайте какие-то реквизиты
<SideBar location = {location} match = {match}/>и используйте их - ищите «условный рендеринг»?