创建一个完全详细的基于React的HTML技术文档网站涉及到多个步骤和文件。以下是一个基本的React项目结构和代码示例,包括了主要的组件、样式、动态内容加载以及基本的路由配置。为了简化,我们假设已经有一个React项目环境搭建好了。
### 项目目录结构
```
1my-tech-docs/
2├── public/
3│ ├── index.html
4│ └── favicon.ico
5├── src/
6│ ├── components/
7│ │ ├── Header.js
8│ │ ├── Navigation.js
9│ │ ├── ContentLoader.js
10│ │ └── Footer.js
11│ ├── styles/
12│ │ └── App.module.scss
13│ ├── App.js
14│ ├── index.js
15│ └── serviceWorker.js
16└── package.json
```
### 1. `src/components/Header.js`
Jsx
```
1import React from 'react';
2import './Header.module.scss';
3
4const Header = () => (
5 <header className="header">
6 <h1>HTML技术文档</h1>
7 <p>Welcome to our comprehensive HTML learning resources.</p>
8 </header>
9);
10
11export default Header;
```
### 2. `src/components/Navigation.js`
Jsx
```
1import React, { useState } from 'react';
2import './Navigation.module.scss';
3
4const sections = [
5 { title: 'Introduction', path: '/introduction' },
6 { title: 'HTML Basics', path: '/basics' },
7 // ... other sections
8];
9
10const Navigation = () => {
11 const [activeSection, setActiveSection] = useState('/introduction');
12
13 return (
14 <nav className="navigation">
15 <ul>
16 {sections.map((section) => (
17 <li key={section.path}>
18 <a
19 href={section.path}
20 onClick={(e) => {
21 e.preventDefault();
22 setActiveSection(section.path);
23 }}
24 className={activeSection === section.path ? 'active' : ''}
25 >
26 {section.title}
27 </a>
28 </li>
29 ))}
30 </ul>
31 </nav>
32 );
33};
34
35export default Navigation;
```
### 3. `src/components/ContentLoader.js`
Jsx
```
1import React, { useEffect } from 'react';
2import './ContentLoader.module.scss';
3
4const ContentLoader = ({ section }) => {
5 useEffect(() => {
6 if (section) {
7 fetch(`sections${section}.json`)
8 .then((response) => response.json())
9 .then((data) => {
10 const contentElement = document.getElementById('content');
11 if (contentElement) {
12 contentElement.innerHTML = data.content;
13 }
14 });
15 }
16 }, [section]);
17
18 return <div id="content" />;
19};
20
21export default ContentLoader;
```
### 4. `src/components/Footer.js`
Jsx
``
1import React from 'react';
2import './Footer.module.scss';
3
4const Footer = () => (
5 <footer className="footer">
6 <p>Copyright © 2024 HTML Tech Docs Team</p>
7 </footer>
8);
9
10export default Footer;
```
### 5. `src/App.js`
Jsx
```
1import React from 'react';
2import Header from './components/Header';
3import Navigation from './components/Navigation';
4import ContentLoader from './components/ContentLoader';
5import Footer from './components/Footer';
6import './App.module.scss';
7
8function App() {
9 return (
10 <div className="App">
11 <Header />
12 <Navigation />
13 <ContentLoader section="/introduction" />
14 <Footer />
15 </div>
16 );
17}
18
19export default App;
```
### 6. `src/styles/App.module.scss`
Scss
```
1.App {
2 display: grid;
3 grid-template-columns: 200px 1fr;
4 grid-gap: 20px;
5
6 .header {
7 grid-column: span 2;
8 text-align: center;
9 }
10
11 .navigation {
12 ul {
13 list-style: none;
14 padding: 0;
15
16 li {
17 a {
18 display: block;
19 padding: 10px;
20 text-decoration: none;
21 color: #333;
22
23 &.active {
24 background-color: #eee;
25 }
26 }
27 }
28 }
29 }
30
31 .content {
32 padding: 20px;
33 }
34
35 .footer {
36 grid-column: span 2;
37 text-align: center;
38 padding: 10px;
39 }
40}
```
### 注意事项
- 这个示例使用了JSON文件来存储每个章节的内容,实际上你可以根据需要使用不同的数据存储方式。
- `ContentLoader`组件使用了`fetch`API来获取内容,你需要在`public`目录下创建相应的JSON文件,或者配置一个后端API来提供这些数据。
- 为了简化,我们直接在`ContentLoader`中修改了DOM元素的`innerHTML`,在生产环境中应该避免这样做,因为这可能会导致XSS攻击。更安全的做法是在React组件中渲染内容。
- 你可能还需要配置React Router来处理不同的URL路由,这超出了这个基础示例的范围。
以上代码仅供参考,具体实现时可能需要根据你的项目需求和React版本进行适当的调整。
标签:项目,section,ContentLoader,js,React,components,目录,### From: https://blog.csdn.net/xiaochouhuang123/article/details/140590354