当前位置: 首页 > article >正文

【React】React 的核心设计思想


鑫宝Code

🌈个人主页: 鑫宝Code
🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础
💫个人格言: "如无必要,勿增实体"


文章目录

  • React 的核心设计思想
    • 引言
    • 声明式编程
      • 声明式 vs 命令式
      • 示例
    • 组件化
      • 组件的优势
      • 组件类型
    • 单向数据流
      • 单向数据流的特点
      • 示例
    • 虚拟 DOM
      • 虚拟 DOM 的工作原理
      • 虚拟 DOM 的优势
    • 状态管理
      • 组件状态
      • 状态提升
      • Context API
      • 第三方状态管理库
    • 生命周期和 Hooks
      • 类组件生命周期
      • Hooks
    • JSX
      • JSX 的优势
      • 示例
    • 封装与复用
      • 组合
      • 高阶组件(HOC)
      • 自定义 Hooks
    • 性能优化
      • React.memo
      • useMemo 和 useCallback
      • 懒加载
    • 总结

React 的核心设计思想

引言

React 自 2013 年由 Facebook 开源以来,已经成为前端开发领域最受欢迎的库之一。它不仅改变了我们构建用户界面的方式,还影响了整个前端生态系统的发展。本文将深入探讨 React 的核心设计思想,这些思想使得 React 在众多 JavaScript 框架中脱颖而出,成为开发者的首选工具。
在这里插入图片描述

声明式编程

React 的核心设计思想之一是声明式编程。这种范式与传统的命令式编程形成鲜明对比。
在这里插入图片描述

声明式 vs 命令式

  • 命令式编程:详细指定每一步操作,告诉计算机"如何做"。
  • 声明式编程:描述期望的结果,让框架决定"如何做"。

React 采用声明式方法来描述 UI。开发者只需声明在任何给定时刻 UI 应该是什么样子,React 负责更新 DOM 以匹配该描述。

示例

// 声明式(React)
function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}

// 命令式(原生 JavaScript)
function welcome(name) {
  const h1 = document.createElement('h1');
  h1.textContent = `Hello, ${name}`;
  document.body.appendChild(h1);
}

声明式编程的优势在于代码更加简洁、易读,并且更容易理解和维护。它让开发者专注于"做什么",而不是"怎么做"。

组件化

组件是 React 的核心概念之一。它允许将 UI 拆分为独立、可复用的部分。
在这里插入图片描述

组件的优势

  1. 模块化:将复杂的 UI 分解为简单的部分。
  2. 可重用性:组件可以在不同的上下文中重复使用。
  3. 可维护性:独立的组件更容易理解和维护。
  4. 封装:组件封装了自己的标记和逻辑。

组件类型

React 支持两种类型的组件:

  1. 函数组件

    function Welcome(props) {
      return <h1>Hello, {props.name}</h1>;
    }
    
  2. 类组件

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

组件化思想使得开发大型应用变得更加可行和高效。它鼓励开发者构建可复用的 UI 库,提高开发效率。

单向数据流

React 采用单向数据流的模式,这是其另一个重要的设计思想。
在这里插入图片描述

单向数据流的特点

  1. 数据自顶向下流动:父组件通过 props 向子组件传递数据。
  2. 状态提升:共享状态应提升到最近的共同祖先组件。
  3. 清晰的数据流向:使应用的数据流动更加可预测。

示例

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

  return (
    <div>
      <Child count={count} onIncrement={() => setCount(count + 1)} />
    </div>
  );
}

function Child({ count, onIncrement }) {
  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={onIncrement}>Increment</button>
    </div>
  );
}

单向数据流简化了应用的状态管理,使得数据变化更容易追踪和调试。

虚拟 DOM

虚拟 DOM(Virtual DOM)是 React 性能优化的关键技术之一。

虚拟 DOM 的工作原理

  1. 创建虚拟 DOM 树:React 在内存中维护一个虚拟 DOM 树。
  2. 比较差异:当状态改变时,React 创建新的虚拟 DOM 树并与旧树比较。
  3. 最小化更新:只将必要的更改应用到实际 DOM。

虚拟 DOM 的优势

  1. 性能优化:减少直接操作 DOM 的次数。
  2. 跨平台:虚拟 DOM 可以映射到不同的渲染目标(如原生移动应用)。
  3. 简化编程模型:开发者可以像操作整个 DOM 树一样编写代码。

虚拟 DOM 使得 React 能够高效地更新 UI,同时保持良好的性能。
在这里插入图片描述

状态管理

状态管理是 React 应用中的核心概念之一。React 提供了多种管理状态的方式。

组件状态

React 组件可以有自己的状态,通过 useState Hook 或类组件的 state 属性管理。

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

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

状态提升

当多个组件需要共享状态时,可以将状态提升到它们的最近共同祖先。

Context API

对于需要在组件树中广泛共享的数据,React 提供了 Context API。

const ThemeContext = React.createContext('light');

function App() {
  return (
    <ThemeContext.Provider value="dark">
      <Toolbar />
    </ThemeContext.Provider>
  );
}

function Toolbar() {
  return (
    <div>
      <ThemedButton />
    </div>
  );
}

function ThemedButton() {
  const theme = useContext(ThemeContext);
  return <Button theme={theme} />;
}

第三方状态管理库

对于复杂应用,可以使用如 Redux 或 MobX 等第三方状态管理库。

React 的状态管理方案灵活多样,可以根据应用的复杂度选择合适的方式。

生命周期和 Hooks

React 组件的生命周期和 Hooks 是其重要的设计概念,它们定义了组件在不同阶段的行为。

类组件生命周期

类组件有明确的生命周期方法,如 componentDidMountcomponentDidUpdatecomponentWillUnmount

Hooks

Hooks 是 React 16.8 引入的新特性,允许在函数组件中使用状态和其他 React 特性。

常用的 Hooks 包括:

  • useState:管理组件状态
  • useEffect:处理副作用
  • useContext:访问 Context
  • useReducer:复杂状态逻辑
  • useMemouseCallback:性能优化
function Example() {
  const [count, setCount] = useState(0);

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

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

Hooks 简化了状态管理和副作用处理,使得函数组件更加强大和灵活。

JSX

JSX 是 React 的一个重要特性,它允许在 JavaScript 中编写类似 HTML 的代码。

JSX 的优势

  1. 声明式:直观地描述 UI 应该是什么样子。
  2. JavaScript 的全部能力:可以在 JSX 中使用 JavaScript 表达式。
  3. 编译时错误检查:语法错误可以在编译时被捕获。
  4. 优化:JSX 编译为高效的 JavaScript 代码。

示例

function Greeting({ name }) {
  return <h1>Hello, {name}!</h1>;
}

const element = <Greeting name="World" />;

JSX 使得编写 UI 组件变得更加直观和高效,是 React 开发中不可或缺的一部分。

封装与复用

React 鼓励通过组合和封装来实现代码复用,而不是继承。

组合

组合是通过将组件组合在一起来创建更复杂的 UI。

function Dialog(props) {
  return (
    <div className="dialog">
      <h1>{props.title}</h1>
      {props.children}
    </div>
  );
}

function WelcomeDialog() {
  return (
    <Dialog title="Welcome">
      <p>Thank you for visiting our spacecraft!</p>
    </Dialog>
  );
}

高阶组件(HOC)

高阶组件是一个函数,接受一个组件并返回一个新组件。

function withLogger(WrappedComponent) {
  return class extends React.Component {
    componentDidMount() {
      console.log('Component is mounted');
    }

    render() {
      return <WrappedComponent {...this.props} />;
    }
  };
}

自定义 Hooks

自定义 Hooks 允许你提取组件逻辑到可重用的函数中。

function useWindowWidth() {
  const [width, setWidth] = useState(window.innerWidth);

  useEffect(() => {
    const handleResize = () => setWidth(window.innerWidth);
    window.addEventListener('resize', handleResize);
    return () => window.removeEventListener('resize', handleResize);
  }, []);

  return width;
}

这些模式使得 React 代码更加模块化和可复用。

性能优化

React 提供了多种方式来优化应用性能。

React.memo

React.memo 是一个高阶组件,用于包装纯函数组件以防止不必要的重新渲染。

const MemoizedComponent = React.memo(function MyComponent(props) {
  /* 渲染使用 props */
});

useMemo 和 useCallback

这两个 Hooks 用于优化计算成本高的操作和回调函数。

const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
const memoizedCallback = useCallback(() => doSomething(a, b), [a, b]);

懒加载

React.lazy 和 Suspense 允许你动态导入组件。

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

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

这些优化技术帮助开发者构建高性能的 React 应用。

总结

React 的设计思想体现了现代前端开发的最佳实践。通过声明式编程、组件化、单向数据流、虚拟 DOM、灵活的状态管理、JSX、强大的生命周期和 Hooks 系统,以及注重封装和复用的理念,React 为开发者提供了一个强大而灵活的工具集。

这些设计思想不仅使得构建复杂的用户界面变得更加简单和高效,还促进了整个前端生态系统的发展。React 的影响远远超出了它本身,它改变了我们思考和构建用户界面的方式。

随着 React 的不断发展,我们可以期待看到更多创新性的特性和优化。然而,核心设计思想可能会保持稳定,继续指导开发者构建高质量、可维护的前端应用。理解和掌握这些核心概念,将帮助开发者更好地利用 React,创造出优秀的用户体验。

End


http://www.kler.cn/a/371561.html

相关文章:

  • Debug日程工作经验总结日程常用
  • 【云计算】KVM虚拟化部署
  • 微信小程序生成海报 / 两张图片合并生成一张
  • JavaScript闭包(Closure)详解与应用实例
  • 医学影像基础:常见的医学影像学术语和概念
  • 利用Django实现MySQL数据库的内容在网页的增删改写
  • 经验总结:typescript 和 axios 项目中大量接口该如何管理和组织
  • 牛客算法简单题(JS版)
  • R语言在机器学习中的应用
  • unity中的材质(material)贴图(texture)着色器(shader)介绍
  • C++设计模式创建型模式———生成器模式
  • 【jvm】什么是TLAB
  • Ubuntu 22.04系统启动时自动运行ROS2节点
  • 【机器学习】Softmax 函数
  • GraphQL系列 - 第1讲 GraphQL语法入门
  • 计算机毕业设计——ssm基于HTML5的互动游戏新闻网站的设计与实现录像演示2021
  • R_机器学习——常用函数方法汇总
  • Java进阶篇设计模式之四 -----适配器模式和桥接模式
  • 会议录音转文字怎么转?有这6款视频语音转文字工具就够了!
  • 微信小程序时间弹窗——年月日时分
  • G2 基于生成对抗网络(GAN)人脸图像生成
  • Pytorch学习--神经网络--非线性激活
  • 【Unity基础】初识UI Toolkit - 运行时UI
  • 【项目复现】——DDoS-SDN Detection Project
  • Nginx + Lua + Redis:打造智能 IP 黑名单系统
  • 「Mac畅玩鸿蒙与硬件14」鸿蒙UI组件篇4 - Toggle 和 Checkbox 组件