16 使用 `Refs` 直接操作 DOM

16 使用 `Refs` 直接操作 DOM

在 React 中,Refs 是一种用于访问和操作组件中的 DOM 节点的方式。通常情况下,React 鼓励使用状态管理和数据流来控制组件,但在某些情况下,我们确实需要直接操作 DOM,这时我们可以使用 Refs

1. 什么是 Refs

Refs 提供了一种方式,用于在 React 组件中访问和操作 DOM 元素。它们可以用于多种情况,比如:

  • 聚焦输入框
  • 播放/暂停视频
  • 动态调整某个组件的尺寸

2. 创建 Refs

在 React 组件中,我们可以使用 React.createRef() 创建 Refs。下面是一个简单的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import React, { Component } from 'react';

class MyComponent extends Component {
constructor(props) {
super(props);
// 创建 Ref
this.inputRef = React.createRef();
}

focusInput = () => {
// 通过 Ref 访问 input 元素并聚焦
this.inputRef.current.focus();
};

render() {
return (
<div>
<input ref={this.inputRef} type="text" />
<button onClick={this.focusInput}>聚焦输入框</button>
</div>
);
}
}

export default MyComponent;

在这个例子中,我们创建了一个 inputRef,并将它分配给 input 元素的 ref 属性。点击按钮时,调用 focusInput 方法聚焦输入框。

3. 在函数组件中使用 Refs

在函数组件中,我们可以使用 useRef 钩子来创建 Refs。示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import React, { useRef } from 'react';

const MyFunctionComponent = () => {
const inputRef = useRef(null);

const focusInput = () => {
// 通过 Ref 访问 input 元素并聚焦
inputRef.current.focus();
};

return (
<div>
<input ref={inputRef} type="text" />
<button onClick={focusInput}>聚焦输入框</button>
</div>
);
};

export default MyFunctionComponent;

在这个例子中,我们使用 useRef 创建 inputRef,达到同样的效果。

4. 使用 Refs 获取 DOM 元素的信息

除了操控 DOM 元素,Refs 还可以用来获取元素的各种信息,如位置、尺寸等。例如,我们可以获取输入框的宽度:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import React, { useRef } from 'react';

const InputWidthComponent = () => {
const inputRef = useRef(null);

const getInputWidth = () => {
if (inputRef.current) {
alert(`输入框的宽度是: ${inputRef.current.offsetWidth}px`);
}
};

return (
<div>
<input ref={inputRef} type="text" />
<button onClick={getInputWidth}>获取输入框宽度</button>
</div>
);
};

export default InputWidthComponent;

5. 使用 Refs 与第三方库集成

有时我们需要与第三方 DOM 库(如 jQuery)进行集成。这时我们也可以使用 Refs。例如,在一个通过 Refs 获取 DOM 的组件中,调用 jQuery 操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import React, { useRef, useEffect } from 'react';
import $ from 'jquery';

const JqueryComponent = () => {
const divRef = useRef(null);

useEffect(() => {
// 使用 jQuery 对 div 进行操作
$(divRef.current).hide().fadeIn();
}, []);

return <div ref={divRef}>这是一个可以用 jQuery 操作的 DIV</div>;
};

export default JqueryComponent;

在这个例子中,使用 useEffect 钩子确保在组件挂载后使用 jQuery 操作该 div

总结

  • Refs 是一种用于访问和操作 React 组件中的 DOM 元素的方式。
  • 借助 React.createRef()useRef() 可以创建 Refs
  • 可以直接通过 Refs 访问和操作 DOM 属性和方法。
  • Refs 也可以与第三方库结合使用。

通过学习和实践 Refs 的使用,可以帮助你更加灵活地操作组件和 DOM,增强用户体验。

17 React Router 的基本使用

17 React Router 的基本使用

1. 简介

React Router 是 React 的一个标准库,用于处理前端路由。它使得在单页应用程序中实现路由变得更加简单和直观。通过 React Router,你可以为不同的 URL 显示不同的组件。

2. 安装

首先,你需要安装 React Router。通过 npm 来安装:

1
npm install react-router-dom

3. 基本概念

React Router 主要由以下几个核心部分组成:

  • BrowserRouter:使用 HTML5 的 history API 来保持 UI 与 URL 同步。
  • Routes:定义路由的容器,Route 是其中的一个子组件。
  • Route:定义你的路由规则,将路径映射到组件。
  • Link:用于创建导航链接,实现页面切换。

4. 创建一个简单的 Router 示例

下面是一个基本的 React Router 使用示例。

4.1 创建项目

你可以使用 Create React App 创建一个新的 React 项目:

1
2
npx create-react-app my-app
cd my-app

4.2 结构

src 目录下创建一个 components 目录,然后创建三个简单的组件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// src/components/Home.jsx
import React from 'react';

const Home = () => {
return <h2>Home Page</h2>;
};

export default Home;

// src/components/About.jsx
import React from 'react';

const About = () => {
return <h2>About Page</h2>;
};

export default About;

// src/components/NotFound.jsx
import React from 'react';

const NotFound = () => {
return <h2>404 Not Found</h2>;
};

export default NotFound;

4.3 添加 Router

src/index.js 中设置路由:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import React from 'react';
import ReactDOM from 'react-dom/client';
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import App from './App';
import Home from './components/Home';
import About from './components/About';
import NotFound from './components/NotFound';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<Router>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
<Route path="*" element={<NotFound />} />
</Routes>
</Router>
);

4.4 创建一个导航

src/App.js 中添加导航链接:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import React from 'react';
import { Link } from 'react-router-dom';

function App() {
return (
<div>
<nav>
<ul>
<li>
<Link to="/">Home</Link>
</li>
<li>
<Link to="/about">About</Link>
</li>
</ul>
</nav>
<hr />
{/* 这里会根据路由展示对应的组件 */}
</div>
);
}

export default App;

通过 Link 组件,你可以创建导航链接,用户点击链接时会改变 URL 但不会刷新页面。例如,在上述 App 组件中,我们使用了两个 Link 组件来导航到不同的路由。

6. 路由中的参数

React Router 还支持路由参数。假设你想要在 About 页面中显示更多信息,比如用户 ID。

6.1 修改路由

1
<Route path="/about/:id" element={<About />} />

6.2 获取路由参数

About 组件中使用 useParams 获取参数:

1
2
3
4
5
6
7
import React from 'react';
import { useParams } from 'react-router-dom';

const About = () => {
let { id } = useParams();
return <h2>About Page for user {id}</h2>;
};

通过这种方式,你可以在URL中传递动态参数。

7. 总结

React Router 是管理 React 应用路由的重要工具。通过理解 BrowserRouterRoutesRoute 组件,你可以创建强大而灵活的导航结构。此外,使用 Link 组件可以方便地实现页面间的导航。

关于更复杂的路由情况,比如嵌套路由、重定向等,可以进一步深入学习 React Router 的文档。

18 从零到上手学习 React 框架教程

18 从零到上手学习 React 框架教程

小节 1: 环境配置

在学习 React 之前,我们需要配置开发环境。以下是配置 React 开发环境的步骤。

1.1 安装 Node.js

在使用 React 之前,首先需要安装 Node.js。可以从 Node.js 官方网站 下载并安装最新版本。

1.2 安装 Create React App

Create React App 是一个官方提供的脚手架工具,可以快速创建 React 应用。打开终端,执行以下命令:

1
npx create-react-app my-app

这将创建一个名为 my-app 的新项目,相关依赖会自动安装。

1.3 启动开发服务器

进入创建的项目文件夹,并启动开发服务器:

1
2
cd my-app
npm start

此时,你的 React 应用应该会在浏览器中自动打开,通常是 http://localhost:3000

小节 2: 配置应用路由

为了在 React 应用中实现页面之间的跳转与路由管理,我们需要使用 react-router-dom 包。以下是配置应用路由的详细步骤。

2.1 安装 react-router-dom

首先,使用 npm 安装 react-router-dom 依赖:

1
npm install react-router-dom

2.2 创建页面组件

为了演示路由的使用,我们需要创建几个基本的页面组件。可以在 src 文件夹中创建以下文件:

  • Home.js
  • About.js
  • NotFound.js

示例 Home.js

1
2
3
4
5
6
7
8
// src/Home.js
import React from 'react';

const Home = () => {
return <h2>首页</h2>;
};

export default Home;

示例 About.js

1
2
3
4
5
6
7
8
// src/About.js
import React from 'react';

const About = () => {
return <h2>关于我们</h2>;
};

export default About;

示例 NotFound.js

1
2
3
4
5
6
7
8
// src/NotFound.js
import React from 'react';

const NotFound = () => {
return <h2>页面未找到</h2>;
};

export default NotFound;

2.3 设置路由

接下来需要在 src/App.js 文件中配置路由。导入所需的组件并设置路由规则。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// src/App.js
import React from 'react';
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
import Home from './Home';
import About from './About';
import NotFound from './NotFound';

const App = () => {
return (
<Router>
<div>
<h1>我的 React 应用</h1>
<Switch>
<Route path="/" exact component={Home} />
<Route path="/about" component={About} />
<Route component={NotFound} />
</Switch>
</div>
</Router>
);
};

export default App;

2.4 访问不同的路由

现在,可以在浏览器中访问不同的路由:

  • 访问 http://localhost:3000/ 将看到“首页”。
  • 访问 http://localhost:3000/about 将看到“关于我们”。
  • 访问一个不存在的页面(例如 http://localhost:3000/unknown)将看到“页面未找到”。

小节总结

在本小节中,我们完成了以下内容:

  1. 安装并配置了 react-router-dom
  2. 创建了基本的页面组件。
  3. 在应用中设置了路由,使得用户可以在不同页面间导航。

通过这些步骤,你的 React 应用现在拥有了基础的路由功能。这是构建更复杂应用的重要基础,接下来可以逐步添加更多功能与页面。