返回首页

说说对 React 的理解?有哪些特性?

问题解析(面试官考察点)

面试官通过此问题主要考察:

  • 对 React 本质的理解程度
  • 是否了解 React 的核心设计理念
  • 对 React 核心特性的掌握情况
  • 能否清晰阐述 React 与其他框架的区别

核心概念(基础知识点)

什么是 React

React 是用于构建用户界面的 JavaScript 库,只提供了 UI 层面的解决方案:

  • 组件设计模式:将界面拆分成独立、可复用的小块
  • 声明式编程:关注"做什么"而非"如何做"
  • 函数式编程概念:使前端应用程序更高效
  • 虚拟 DOM:有效地操作 DOM
  • 单向数据流:从高阶组件到低阶组件的数据传递

React 的核心特性

  1. JSX 语法:JavaScript 的语法扩展,允许在 JS 中编写类似 HTML 的结构
  2. 单向数据绑定:数据只能从父组件流向子组件
  3. 虚拟 DOM:内存中的 DOM 表示,提高渲染性能
  4. 声明式编程:描述 UI 应该是什么样子,而非如何到达该状态
  5. Component(组件化):一切皆为组件,组件可组合、嵌套

详细解答(代码示例)

基础组件示例

// 类组件
class HelloMessage extends React.Component {
  render() {
    return <div>Hello {this.props.name}</div>;
  }
}

ReactDOM.render(
  <HelloMessage name="Taylor" />,
  document.getElementById("hello-example")
);

上述类似 XML 的形式就是 JSX,最终会被 Babel 编译为合法的 JS 语句调用:

// 编译后的代码
React.createElement("div", null, "Hello ", this.props.name);

声明式编程示例

命令式编程(传统方式):

// 创建地图
const map = new Map.map(document.getElementById("map"), {
  zoom: 4,
  center: { lat, lng },
});

// 创建标记
const marker = new Map.marker({
  position: { lat, lng },
  title: "Hello Marker",
});

// 地图上添加标记
marker.setMap(map);

声明式编程(React 方式):

<Map zoom={4} center={(lat, lng)}>
  <Marker position={(lat, lng)} title={"Hello Marker"} />
</Map>

函数组件与类组件示例

// 函数组件
const Header = () => {
  return (
    <Jumbotron style={{ backgroundColor: "orange" }}>
      <h1>TODO App</h1>
    </Jumbotron>
  );
};

// 类组件
class Dashboard extends React.Component {
  constructor(props) {
    super(props);
    this.state = {};
  }

  render() {
    return (
      <div className="dashboard">
        <ToDoForm />
        <ToDoList />
      </div>
    );
  }
}

深入理解(原理剖析)

组件的特点

一个优秀的 React 组件应具备以下特点:

  1. 可组合(Composable)

    • 每个组件易于和其他组件一起使用
    • 可以嵌套在另一个组件内部
  2. 可重用(Reusable)

    • 每个组件都是具有独立功能的
    • 可以被使用在多个 UI 场景
  3. 可维护(Maintainable)

    • 每个小的组件仅仅包含自身的逻辑
    • 更容易被理解和维护

React 的优势

优势 说明
高效灵活 虚拟 DOM 减少真实 DOM 操作,提升性能
声明式设计 代码简单,易于理解和维护
组件式开发 提高代码复用率,降低耦合度
单向数据流 比双向绑定更安全,数据流向清晰,便于调试

JSX 的工作原理

JSX 不是合法的 JavaScript,需要经过转换:

  1. 编写阶段:使用 JSX 语法编写组件
  2. 编译阶段:Babel 将 JSX 转换为 React.createElement() 调用
  3. 执行阶段React.createElement() 返回 React 元素(描述 UI 的普通对象)
  4. 渲染阶段:React DOM 将 React 元素更新到真实 DOM
// JSX
const element = <h1 className="greeting">Hello, world!</h1>;

// 编译后
const element = React.createElement(
  'h1',
  {className: 'greeting'},
  'Hello, world!'
);

// 返回的 React 元素
const element = {
  type: 'h1',
  props: {
    className: 'greeting',
    children: 'Hello, world!'
  }
};

最佳实践

  1. 组件拆分原则

    • 单一职责原则:一个组件只做一件事
    • 当组件变得复杂时,考虑拆分成更小的组件
  2. Props 设计

    • 保持 Props 简单明了
    • 使用解构赋值获取 props
  3. 状态管理

    • 尽量使用函数组件 + Hooks
    • 状态提升:将共享状态提升到最近的公共父组件
  4. 性能优化

    • 使用 React.memo 避免不必要的重渲染
    • 使用 useMemo 和 useCallback 缓存计算结果和回调函数

面试要点

  1. React 是库不是框架

    • 只关注视图层
    • 需要配合其他库(如 React Router、Redux)构建完整应用
  2. 虚拟 DOM 的优势

    • 减少直接操作 DOM 的性能开销
    • 跨平台能力(React Native)
    • 通过 Diff 算法最小化 DOM 更新
  3. 单向数据流 vs 双向绑定

    • 单向数据流:数据只能从父组件流向子组件
    • 优势:数据流向清晰,易于追踪和调试
    • 对比 Vue/Angular 的双向绑定
  4. 常见误区澄清

    • JSX 不是模板引擎
    • React 不依赖 JSX(可以使用 React.createElement
    • 虚拟 DOM 不一定比直接操作 DOM 快(在简单场景下)