#reactjs #next.js
Вопрос:
Я пытаюсь использовать динамический путь с помощью приложения nextjs.
Я разрабатываю систему CMS, и мои страницы проходят через nextjs.
В моем приложении администратора react пользователь может добавлять и создавать несколько страниц.
Существует приложение nextjs для конечных пользователей, которое позволяет пользователям получать эти динамические страницы.
Например: Администратор приложения добавил страницу об этом, и теперь пользователь может получить доступ к этой странице, введя следующее в браузере.
http://localhost:3000/aboutus
Это должно сработать, но этого не происходит. Первое, что делает nextjs, выдает ошибку, когда мы пытаемся использовать useRouter hook
и получить pathname
(это показывает ошибку), и пытаемся найти aboutus.js компонент страницы, который физически не существует.
Во-вторых, нам нужен компонент react, что-то вроде App.js component
того, чтобы мы могли идентифицировать динамическую страницу и вызывать нашу логику для отображения страницы, но в nextjs нет ничего подобного App.js component
index.js
компоненту nor. У Nextjs есть MyApp.js компонент, который является отправной точкой для запуска каждого компонента страницы с его свойствами, но я не могу написать здесь логику.
Я хочу, чтобы доступ к динамическим страницам осуществлялся с помощью динамического маршрута. должно сработать следующее
http://localhost:3000/aboutus
http://localhost:3000/contact
Пожалуйста, посмотрите мой код ниже
========================================package.json==================================
{
"name": "test",
"version": "0.1.0",
"private": true,
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "next lint"
},
"dependencies": {
"bootstrap": "^5.0.2",
"next": "11.0.1",
"node-sass": "^4.14.1",
"react": "17.0.2",
"react-bootstrap": "^1.6.1",
"react-dom": "17.0.2",
"swr": "^1.0.0"
},
"devDependencies": {
"eslint": "7.29.0",
"eslint-config-next": "11.0.1"
},
}
=================================================MyApp======================================
import "../styles/styles.css";
function MyApp({ Component, pageProps }) {
return (
<SharedProvider>
<Component {...pageProps} />
</SharedProvider>
);
}
export default MyApp;
==========================================================index.js=======================
import React, { useState, useEffect } from "react";
import Link from "next/link";
import { useRouter } from "next/router";
import Head from "next/head";
import Layout from "../components/layout/layout";
function Home({ resData }) {
const router = useRouter();
const { permalink } = router.query;
const [pageId, setPageId] = useState(0);
useEffect(() => {
onLoad();
}, []);
function onLoad() {
let range = document.createRange();
const wrapper = document.querySelector(".ic-container");
wrapper.innerHTML = "";
wrapper.appendChild(range.createContextualFragment(resData.PageContent));
}
return (
<>
<Head>
<title>{resData.Title}</title>
<meta property="og:description" name="description" content={resData.MetaDescription} key="description" />
<meta property="og:keywords" name="keywords" content={resData.Keywords} key="keywords" />
<meta property="og:title" name="title" content={resData.MetaTitle} key="title" />
<meta property="og:author" name="author" content="test" key="author" />
<link rel="stylesheet" href="/assets/minimalist-blocks/content.css" />
<link href="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick.min.css" rel="stylesheet" type="text/css" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick.min.js"></script>
<script
src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.1/dist/js/bootstrap.bundle.min.js"
integrity="sha384-/bQdsTh/da6pkI1MST/rWKFNjaCP5gBSY4sEBT38Q/9RBh9AH40zEOg7Hlq2THRZ"
crossorigin="anonymous"
></script>
</Head>
<Layout>
<div className="ic-container">
<div></div>
</div>
</Layout>
</>
);
}
export async function getServerSideProps(context) {
const { perm } = context.query;
let resData = "";
try {
const fetchResponse = await fetch("http://localhost:3001/asa/page/pageByPer/" perm);
const data = await fetchResponse.json();
const responseData = data amp;amp; data.page amp;amp; data.page.length > 0 ? data.page[0] : "";
initialData = responseData;
if (data) {
if (data.isExist > 0) {
lpageId = responseData.Id;
}
}
} catch (e) {
console.log(e);
} finally {
}
return {
props: {
resData,
},
};
}
export default Home;
Как это лучше всего исправить ? спасибо вам за помощь
Комментарии:
1. Как выглядит ваша структура файлов в разделе
/pages
? Вы действительно определили динамическую страницу?2. /pages/index.js , /pages/_app.js.
3. Если цель состоит в том, чтобы использовать динамический путь, первым шагом будет настройка динамического маршрута .
4. Привет, спасибо тебе, Джули. Вот некоторая путаница, которую я хочу понять. Я прочитал эту страницу. Будет ли работать динамический маршрут, когда пользователь n введет URL-адрес в браузере. Как и при вводе пользователем localhost:3000/dynamicpage, определения этой страницы нет. Нет никакого dynamicpage.js в разделе каталог страниц. Что ты теперь скажешь?
Ответ №1:
Джулиомальвес прав.
Создайте компонент, подобный этому [страница].js в каталоге страниц.
Следующее будет работать. Пожалуйста, попробуйте следовать
const Page = ({ resData }) => {
const router = useRouter();
const { page } = router.query;
const [pageId, setPageId] = useState(0);
useEffect(() => {
onLoad();
}, []);
function onLoad() {
let range = document.createRange();
const wrapper = document.querySelector(".ic-container");
wrapper.innerHTML = "";
wrapper.appendChild(range.createContextualFragment(resData.PageContent));
}
return (
<>
<Head>
<title>{resData.Title}</title>
<meta property="og:description" name="description" content={resData.MetaDescription} key="description" />
<meta property="og:keywords" name="keywords" content={resData.Keywords} key="keywords" />
<meta property="og:title" name="title" content={resData.MetaTitle} key="title" />
<meta property="og:author" name="author" content="test" key="author" />
<link rel="stylesheet" href="/assets/minimalist-blocks/content.css" />
<link href="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick.min.css" rel="stylesheet" type="text/css" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick.min.js"></script>
<script
src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.1/dist/js/bootstrap.bundle.min.js"
integrity="sha384-/bQdsTh/da6pkI1MST/rWKFNjaCP5gBSY4sEBT38Q/9RBh9AH40zEOg7Hlq2THRZ"
crossorigin="anonymous"
></script>
</Head>
<Layout>
<div className="ic-container">
<div></div>
</div>
</Layout>
</>
);
}
export async function getServerSideProps(context) {
const { page } = context.query;
let resData = "";
try {
const fetchResponse = await fetch("http://localhost:3001/asa/page/pageByPer/" page );
const data = await fetchResponse.json();
const responseData = data amp;amp; data.page amp;amp; data.page.length > 0 ? data.page[0] : "";
initialData = responseData;
if (data) {
if (data.isExist > 0) {
lpageId = responseData.Id;
}
}
} catch (e) {
console.log(e);
} finally {
}
return {
props: {
resData,
},
};
}