暗黑模式
React 组件:构建复用与解耦的界面 
React 是前端开发中最受欢迎的库之一,其主要特点就是其组件化的架构。React 组件允许开发者构建可重用、独立、高内聚的 UI 代码,从而提高开发速度和代码质量。
1. 什么是组件? 
在 React 中,组件可以被看作是 UI 的独立、可重用的部分。它们就像 JavaScript 函数一样,接收任意的输入(称为“props”)并返回 React 元素,描述页面上的内容。
2. 函数组件与类组件 
React 中有两种主要的组件类型:函数组件和类组件。
函数组件 
最简单的函数组件:
javascript
function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}类组件 
对于需要更多功能(如状态)的组件,你可以使用 ES6 的类:
javascript
class Welcome extends React.Component {
  render() {
    return <h1>Hello, {this.props.name}</h1>;
  }
}3. Props 
Props 是父组件传递给子组件的参数,它们是只读的。
javascript
function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}
const element = <Welcome name="Sara" />;
ReactDOM.render(
  element,
  document.getElementById('root')
);4. State 
与 props 不同,state 是组件内部特有的,可以改变,并会导致组件重新渲染。
javascript
class Counter extends React.Component {
  constructor(props) {
    super(props);
    this.state = { count: 0 };
  }
  handleIncrement = () => {
    this.setState({ count: this.state.count + 1 });
  };
  render() {
    return (
      <div>
        <p>Count: {this.state.count}</p>
        <button onClick={this.handleIncrement}>Increment</button>
      </div>
    );
  }
}5. 生命周期 
React 类组件有多个生命周期方法,你可以在其中添加代码以运行于特定时间:
componentDidMount: 组件被插入到 DOM 后立即调用。componentDidUpdate: 更新后立即调用。componentWillUnmount: 组件从 DOM 卸载和销毁前立即调用。
6. 事件处理 
在 React 中,事件处理与 DOM 事件处理略有不同:
javascript
class Toggle extends React.Component {
  constructor(props) {
    super(props);
    this.state = { isToggleOn: true };
    // 这个绑定是必要的,使`this`在回调中起作用
    this.handleClick = this.handleClick.bind(this);
  }
  handleClick() {
    this.setState(state => ({
      isToggleOn: !state.isToggleOn
    }));
  }
  render() {
    return (
      <button onClick={this.handleClick}>
        {this.state.isToggleOn ? 'ON' : 'OFF'}
      </button>
    );
  }
}7. 用 props 和 state 传递数据 
在 React 中,数据从顶部向下流动(也被称为“单向数据流”或“单向绑定”)。
我下面深入探讨 React 中的高级组件特性,如 hooks, context 和 refs。
9. Hooks 
Hooks 是 React 16.8 版本中新增的特性,它允许你在不编写 class 的情况下使用 state 和其他 React 特性。
useState 
这是最常用的 Hook,用于添加组件的状态。
javascript
import React, { useState } from 'react';
function Counter() {
  const [count, setCount] = useState(0);
  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={() => setCount(count + 1)}>Increment</button>
    </div>
  );
}useEffect 
useEffect 用于在组件渲染后执行副作用。
javascript
import React, { useState, useEffect } from 'react';
function App() {
  const [data, setData] = useState([]);
  useEffect(() => {
    fetch('/api/data')
      .then(res => res.json())
      .then(data => setData(data));
  }, []);
  return (
    <div>
      {data.map(item => (
        <p key={item.id}>{item.name}</p>
      ))}
    </div>
  );
}10. Context 
React 的 Context API 允许你在组件树中更方便地传递数据,而无需通过每个层级的 props。
创建 Context 
首先,你需要创建一个 Context 对象。
javascript
const ThemeContext = React.createContext('light');使用 Context 
然后,你可以使用 Provider 和 Consumer 或 useContext Hook。
javascript
import React, { useContext } from 'react';
function ThemedButton() {
  const theme = useContext(ThemeContext);
  return <button theme={theme}>Themed button</button>;
}11. Refs 
Refs 提供了一种访问 DOM 节点或 React 元素的方式。
javascript
class MyComponent extends React.Component {
  constructor(props) {
    super(props);
    this.myRef = React.createRef();
  }
  render() {
    return <div ref={this.myRef} />;
  }
}或者在函数组件中使用 useRef:
javascript
import React, { useRef, useEffect } from 'react';
function MyComponent() {
  const myRef = useRef(null);
  useEffect(() => {
    myRef.current.focus();
  }, []);
  return <input ref={myRef} />;
}12. 总结 
React 组件是前端开发中的一个强大工具,它不仅提供了一种优雅、高效的方式来构建用户界面,还提供了多种高级特性,如 hooks 和 context,以便在更复杂的应用程序中进行使用。
通过掌握这些基础和高级概念,我们将更好地理解 React 的工作原理,并可以构建更加强大、可维护的应用程序。