CMS

【React】学习笔记-基础篇

虚拟 DOM 的原理是什么?为什么比直接操作 DOM 高效?

  • 虚拟 DOM 是一个轻量的 JS 对象,用来描述真实 DOM 的层次和属性。
  • 通过 Diff 算法最小化 DOM 操作,减少重绘和回流。

JSX 是什么?和普通 JavaScript 的区别?

  • JSX 是语法糖,最终会被 Babel 编译为 React.createElement() 调用。

数据流

  • 单向数据流,自上而下传递。
  • 父组件通过 props 把数据传递给子组件;
  • 子组件可以通过回调函数通知父组件。

Props

  • PropTypes 定义类型
  • defaultProps 定义默认值
  • this.props.children 表示组件的所有子节点
  • 不要把 props 复制到 state 中,要尽可能把 props 当作数据源(避免反模式)

高阶组件(HOC)

  • 用于复用组件逻辑。本质上是一个函数,通过接收一个组件并返回一个新组件

PureComponent 和 React.memo

  • PureComponent 会对 props 和 state 进行浅比较
  • memo 只对 props 进行浅比较

<Fragment><> (空标签)的区别

  • 只有 <Fragment> 可以带 key 属性,这在列表渲染时非常重要

类组件和函数组件的区别?

  • 语法与结构
class MyComponent extends React.Component {
  render() {
    return <div>Hello, {this.props.name}</div>;
  }
}

function MyComponent(props) {
  return <div>Hello, {props.name}</div>;
}
  • 状态管理
  • 类组件通过 this.state 定义状态,this.setState() 更新状态
  • 函数组件使用 Hooks 的 useState 管理状态
  • 生命周期与副作用
  • 类组件通过生命周期处理副作用
  • 函数组件通过 useEffect 替代生命周期
  • this 的绑定问题
  • 类组件通过手动绑定事件函数的 this
class
 Button extends React.Component {
  handleClick() { console.log(this); } // this 可能为 undefined
  render() {
    return <button onClick={this.handleClick.bind(this)}>Click</button>;
  }
}
  • 函数组件没有 this,直接访问 props 和状态
function Button() {
  const handleClick = () => console.log("No this!");
  return <button onClick={handleClick}>Click</button>;
}
  • 性能优化
  • 类组件使用 shouldComponentUpdatePureComponent 避免不必要的渲染
  • 函数组件使用 React.memo 进行浅比较

【状态管理】

React 中的状态提升(Lifting State Up)是什么?

  • 把状态提升到父组件进行管理,子组件通过 props 读取数据。

Context API 的作用?如何避免不必要的渲染?

  • Context(上下文) 是 React 提供的跨层级组件数据传递方案,用于解决多层组件嵌套时(逐层传递 props)的问题。
  • 核心作用
  • 跨组件共享数据(如主题、用户信息、全局配置等)
  • 避免中间组件透传 props(减少冗余代码)

MobX / Redux

  • 全局状态管理,把状态抽离到组件之外。

Redux

  • 工作流程:
    1. 定义 Store:集中管理全局状态(createStore)。
    2. 派发 Action:组件通过 dispatch(action) 发出状态修改请求(action 是一个描述“发生了什么”的普通对象)。
    3. 执行 Reducer:根据 action.type,纯函数 reducer 计算新状态(不可变更新)。
    4. 更新视图:Store 通知订阅者(如 React 组件),触发重新渲染。
  • 核心概念:
    • 单向数据流:View → Action → Reducer → Store → View
    • 三大原则:单一数据源、状态只读、纯函数修改。
  • 总结:
    • 组件 dispatch → Reducer 处理 → Store 更新 → 视图同步

MobX

  • 工作流程:
    1. 定义 Observable State:用 @observable 或 makeObservable 标记可变状态。
    2. 修改 State:在 @action 函数中更新状态(直接赋值/修改对象属性)。
    3. 自动追踪依赖:组件用 observer 包裹,自动订阅其依赖的状态。
    4. 触发更新:状态变化时,依赖它的组件自动重渲染。
  • 核心概念:
    • 响应式编程:像 Excel 公式一样自动更新(无需手动 dispatch/reducer)。
    • 直接修改状态(但通过 action 规范变更)。
  • 总结:
    • 响应式状态,自动追踪依赖,修改即更新

【性能优化】

React 的渲染机制是怎样的?如何避免不必要的渲染?

  • 使用 React.memo、useMemo、useCallback、避免内联对象/函数。

React 的 key 属性有什么作用?

  • 帮助 React 识别元素变化,优化列表渲染。

实现代码分割(Code Splitting)

  • 动态 import() 语法
  • 动态 import() 是 ES2020 引入的语法,返回一个 Promise:
// 普通模块中使用
import("./math").then(math => {
  console.log(math.add(16, 26));
});

// React 组件中使用
import("./OtherComponent").then(OtherComponent => {
  // 使用加载的组件
});
  • React.lazy + Suspense
  • React.lazy 和 Suspense 来实现组件的懒加载:
import React, { Suspense } from 'react';

const OtherComponent = React.lazy(() => import('./OtherComponent'));

function MyComponent() {
  return (
    <div>
      <Suspense fallback={<div>Loading...</div>}>
        <OtherComponent />
      </Suspense>
    </div>
  );
}

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注