Skip to content

React技术介绍

引言

React 是一个由 Facebook 开发并维护的强大的 JavaScript 库,用于构建用户界面。这个库有助于开发者创建富有交互性和动态性的 Web 应用。本文旨在详细、结构化地解析 React 的各个方面,从基础到高级概念,同时结合代码示例进行说明。

目录

  1. React 简介
  2. JSX(JavaScript XML)
  3. 组件与Props
  4. State与生命周期
  5. 事件处理
  6. 条件渲染
  7. 列表与Keys
  8. 表单
  9. 提升State
  10. 组合 VS 继承
  11. React Router
  12. 状态管理(Redux)
  13. Hooks
  14. React和APIs
  15. 测试与调试
  16. 服务器端渲染(SSR)
  17. 部署与优化
  18. 社区与资源
  19. 总结

1. React 简介

React 是一个用于构建用户界面的库。它允许你构建复杂的 UI,同时确保 UI 与数据状态同步。

安装与创建第一个React应用

使用create-react-app可以轻易地创建一个React应用:

bash
npx create-react-app my-app

2. JSX(JavaScript XML)

JSX 是 JavaScript 的一种扩展,它让我们可以直接在 JavaScript 中编写类似 HTML 的标记。

jsx
const element = <h1>Hello, world!</h1>;

3. 组件与Props

组件让你可以将 UI 划分成独立可复用的片段。

函数组件

jsx
function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}

类组件

jsx
class Welcome extends React.Component {
  render() {
    return <h1>Hello, {this.props.name}</h1>;
  }
}

使用 Props

Props 是 React 组件的输入,它们对于组件来说是只读的。

jsx
const element = <Welcome name="Sara" />;

4. State与生命周期

State 是 React 组件的私有数据存储。

添加本地State

jsx
class Clock extends React.Component {
  constructor(props) {
    super(props);
    this.state = {date: new Date()};
  }
}

生命周期方法

  • componentDidMount()
  • componentWillUnmount()
jsx
componentDidMount() {
  this.timerID = setInterval(
    () => this.tick(),
    1000
  );
}

componentWillUnmount() {
  clearInterval(this.timerID);
}

5. 事件处理

在 React 中,事件处理非常简单并且易于理解。事件名采用小驼峰命名,而不是全小写。

jsx
<button onClick={handleClick}>
  Click me
</button>

事件处理函数

jsx
function handleClick() {
  console.log('The button was clicked.');
}

6. 条件渲染

在 React 中,你可以用条件语句创建不同的 UI 片段。

jsx
function Greeting(props) {
  const isLoggedIn = props.isLoggedIn;
  if (isLoggedIn) {
    return <h1>Welcome back!</h1>;
  } else {
    return <h1>Please sign up.</h1>;
  }
}

7. 列表与 Keys

React 中的列表渲染和 JavaScript 中的数组方法有着很多相似之处。

jsx
const numbers = [1, 2, 3, 4, 5];
const listItems = numbers.map((number) => 
  <li key={number.toString()}>{number}</li>
);

8. 表单

React 中的表单元素和其他 DOM 元素略有不同,因为表单元素在 React 中是可控组件。

jsx
class NameForm extends React.Component {
  constructor(props) {
    super(props);
    this.state = {value: ''};
  }

  handleChange = (event) => {
    this.setState({value: event.target.value});
  }

  render() {
    return (
      <form>
        <label>
          Name:
          <input type="text" value={this.state.value} onChange={this.handleChange} />
        </label>
      </form>
    );
  }
}

9. 提升 State

在 React 中,多个组件需要共享数据时,可以通过提升 State 达到这一目的。

jsx
function BoilingVerdict(props) {
  if (props.celsius >= 100) {
    return <p>The water would boil.</p>;
  }
  return <p>The water would not boil.</p>;
}

10. 组合 VS 继承

React 推荐使用组合而非继承来达到组件之间的代码复用。

jsx
function FancyBorder(props) {
  return (
    <div className={'Fancy Fancy-' + props.color}>
      {props.children}
    </div>
  );
}

11. React Hooks

React Hooks 是从 React 16.8 版本开始添加的新特性,它允许你在不编写 class 的情况下使用 state 和其他 React 特性。

useState

最基础的 Hook 是 useState

jsx
import React, { useState } from 'react';

function Example() {
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}

useEffect

useEffect Hook 可以让你在函数组件中执行副作用操作。

jsx
import React, { useState, useEffect } from 'react';

function Example() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    document.title = `You clicked ${count} times`;
  });

  return (
    // ... same as above
  );
}

12. 高阶组件(HOC)

高阶组件(HOC)是一种用于复用组件逻辑的高级技术。

jsx
function withSubscription(WrappedComponent, selectData) {
  return class extends React.Component {
    constructor(props) {
      super(props);
      this.state = {
        data: selectData(DataSource, props)
      };
    }
    // ...
  }
}

13. React Router

React Router 是一种基于 React 之上的强大路由库,它可以让你添加新的屏幕和流程到你的应用,同时保持 URL 与之同步。

jsx
import { BrowserRouter as Router, Route, Link } from 'react-router-dom';

function App() {
  return (
    <Router>
      <div>
        <nav>
          <ul>
            <li>
              <Link to="/">Home</Link>
            </li>
            <li>
              <Link to="/about">About</Link>
            </li>
          </ul>
        </nav>

        <Route path="/" exact component={Home} />
        <Route path="/about" component={About} />
      </div>
    </Router>
  );
}

14. 状态管理库 Redux

Redux 是一种用于管理状态的可预测的状态容器。它主要用于 JavaScript 应用,尤其是单页面应用。

javascript
import { createStore } from 'redux';

function counter(state = 0, action) {
  switch (action.type) {
    case 'INCREMENT':
      return state + 1;
    case 'DECREMENT':
      return state - 1;
    default:
      return state;
  }
}

let store = createStore(counter);

15. 测试与调试

在前端开发中,测试和调试是非常重要的环节。React 社区有一系列成熟的测试工具和库。

Jest

Jest 是一个流行的 JavaScript 测试框架,与 React 有很好的集成。

javascript
// sum.test.js
const sum = require('./sum');

test('adds 1 + 2 to equal 3', () => {
  expect(sum(1, 2)).toBe(3);
});

React Testing Library

这个库提供了一系列 React 组件测试的工具。

jsx
import { render, fireEvent } from '@testing-library/react';
import Button from './Button'; // 你的组件

test('button click changes props', () => {
  const { getByText } = render(<Button label="click me please" />);
  const button = getByText('click me please');
  fireEvent.click(button);
  expect(button.textContent).toBe('You clicked me!');
});

16. 服务器端渲染(SSR)

React 支持服务器端渲染,这通常用于改进首次加载性能或SEO。

jsx
import React from 'react';
import ReactDOMServer from 'react-dom/server';

const element = <h1>Hello, world</h1>;
const html = ReactDOMServer.renderToString(element);

17. 部署与优化

前端应用的部署和优化也是一个大话题,包括但不限于代码拆分、懒加载、持续集成等。

代码拆分

通过Webpack等工具,你可以将代码拆分成不同的小块,然后按需加载。

javascript
import(/* webpackChunkName: "my-chunk-name" */ './module').then(({ default: myModule }) => {
  // 使用模块
});

18. 社区与资源

React 有一个庞大并且活跃的社区,你可以在以下平台获取更多的信息和帮助:

推荐阅读

19. 总结

React 是一个非常强大和灵活的前端框架,它允许开发者以组件化的方式构建用户界面。这篇文章详细介绍了 React 的各个方面,从基础语法和概念到更高级的主题,如状态管理、路由、测试、服务器端渲染、和部署。

我们讨论了如何使用 JSX 来描述 UI,以及如何通过组件和 props 创建复杂的 UI。文章也涉及了 React 中状态管理的不同方式,包括使用 React 自身的 useStateuseEffect,以及第三方库 Redux 和 MobX。

我们还讨论了如何使用路由库(如 React Router)来管理应用的导航,以及如何利用各种测试工具和库(如 Jest 和 React Testing Library)来确保代码质量。

在服务器端渲染(SSR)和代码优化方面,我们也有所涉及,这些是任何大型应用都需要考虑的关键因素。

最后,我们也简要介绍了 React 的社区和其他学习资源,以便你能进一步扩展你的知识和技能。

总体而言,React 是一个不断发展的生态系统,具有广泛的应用场景和丰富的功能。无论你是一个前端新手,还是一个经验丰富的开发者,掌握 React 都将是一个长远和有价值的投资。