我被这个问题困扰了很多天。我在用Next.js https://nextjs.org/并有 3 页。
- 页面/index.js
- 页面/categories.js
- 页面/类别/[slug].js
The categories/[slug].js
正在使用Next.js https://nextjs.org/获取方法名称获取服务器端属性 https://nextjs.org/docs/basic-features/data-fetching#getserversideprops-server-side-rendering它在每个请求上运行并用于在运行时构建动态页面。这categories/[slug].js
正在页面上呈现动态内容,动态内容来自 CMS 作为 API 端点的响应。动态内容只不过是一个包含 HTML 的字符串<script />
元素。
Note:要从 CMS 获取内容,我们必须发送POST
请求与CMS
凭据,例如用户名、密码和内容的页面片段。我在用axios https://github.com/axios/axios发送 post 请求的库,方法在里面post.js
file.
post.js:
import axios from 'axios';
const postCMS = async (slug) => {
const url = `${process.env.CMS_API_URL}/render-page/`;
let pageSlug = slug;
// If the pageSlug is not start with `/`, then create the slug with `/`
if (!pageSlug.startsWith('/')) {
pageSlug = `/${pageSlug}`;
}
const head = {
Accept: 'application/json',
'Content-Type': 'application/json'
};
const data = JSON.stringify({
username: process.env.CMS_API_USERNAME,
password: process.env.CMS_API_PASSWORD,
slug: pageSlug
});
try {
const response = await axios.post(url, data, {
headers: head
});
return response.data;
} catch (e) {
return e;
}
};
export default postCMS;
但对于渲染内容categories/[slug].js
页面,我正在使用Reactjs https://reactjs.org/道具名称危险地设置InnerHTML https://reactjs.org/docs/dom-elements.html#dangerouslysetinnerhtml渲染所有包含以下内容的 HTML<script />
JSON 字符串中的元素。
页面/类别/[slug].js:
<div dangerouslySetInnerHTML={{ __html: result.html }} />
内容根据每个 slug 加载良好。但是当我导航到该类别页面时,即pages/categories/index.js
.
<Link href="/categories/[slug]" as="/categories/online-cloud-storage">
<a>Online Cloud Storage</a>
</Link>
它有一个<Link />
元素以及当我单击它时。
动态内容加载正常,但动态内容包含accordion
and slider
他们不起作用的元素。我认为<script />
这些元素不起作用。但是当我刷新页面时它们工作正常。看到这个。
当我将链接设置为这样时,它们也可以正常工作。
<Link href="/categories/online-cloud-storage" as="/categories/online-cloud-storage">
<a>Online Cloud Storage</a>
</Link>
但是像上面的方法设置链接后,点击会导致页面硬重新加载。但我不想要这个。一切都应该有效。当用户单击类别链接时。
有没有办法来解决这个问题?
为什么当您单击categories/index.js
page?
Github 仓库 https://github.com/john45321/next.js-dynamic-content
Code:
页面/index.js:
import React from 'react';
import Link from 'next/link';
const IndexPage = () => {
return (
<div>
<Link href="/categories">
<a>Categories</a>
</Link>
</div>
);
};
export default IndexPage;
页面/类别/index.js:
import React from 'react';
import Link from 'next/link';
const Categories = () => {
return (
<div>
<Link href="/categories/[slug]" as="/categories/online-cloud-storage">
<a>Online Cloud Storage</a>
</Link>
</div>
);
};
export default Categories;
页面/类别/[slug].js:
import React from 'react';
import Head from 'next/head';
import postCMS from '../../post';
const CategoryPage = ({ result }) => {
return (
<>
<Head>
{result && <link href={result.assets.stylesheets} rel="stylesheet" />}
</Head>
<div>
<h1>Category page CMS Content</h1>
<div dangerouslySetInnerHTML={{ __html: result.html }} />
</div>
</>
);
};
export const getServerSideProps = async (context) => {
const categorySlug = context.query.slug;
const result = await postCMS(categorySlug);
return {
props: {
result
}
};
};
export default CategoryPage;