聊一聊前端框架React:梳理其核心概念

文摘   2024-09-12 00:54   四川  

0 引言

在当今快速发展的Web开发领域,React 依旧是构建动态且响应迅速的用户界面的核心工具。无论您是资深开发者还是初学者,掌握React的核心概念对于充分利用其强大功能至关重要。本文将深入探讨React的基本原则,从其组件化架构到Hooks的强大功能,旨在为您打下坚实的基础,助您提升React技能。让我们开始探索吧!

1 React:是库而非框架

React 是一个专注于UI渲染的JavaScript库,而非全栈框架。与框架不同,React不强制使用特定的开发模式,而是提供灵活性,允许开发者自由选择工具和架构来构建应用程序。这种专注于单一职责的设计理念,使得React在开发者中广受欢迎。

2 虚拟DOM:性能优化的关键

DOM(文档对象模型)是构成应用程序用户界面的基础。每当UI发生变化时,DOM都需要更新以反映这些变化。由于DOM操作成本高昂,频繁的更新会导致性能问题。

为了解决这一问题,React引入了虚拟DOM的概念。虚拟DOM是DOM的一个轻量级副本,它在内存中模拟DOM结构。当应用状态改变时,React首先更新虚拟DOM,然后通过高效的算法(如diff算法)计算出最小化的变更集,最后仅将这些必要的变更应用到真实的DOM上。

上图中,红色圆圈标出了发生变化的节点,这些节点代表了状态更新后需要重新渲染的UI元素。通过比较新旧虚拟DOM树,React能够精确地识别出哪些部分发生了变化,并仅对这些部分进行实际的DOM更新,从而显著提升了性能。

总结

  1. 虚拟DOM在内存中更新,而非直接操作真实DOM。

  2. React通过比较新旧虚拟DOM树,找出差异。

  3. 仅将必要的变更应用到真实DOM,减少性能损耗。

  4. 最终,这些变更反映到屏幕上,实现UI的更新。

3 JSX:React的声明式语法

JSX(JavaScript XML)是React中的一种语法扩展,它允许开发者使用类似于HTML的语法来编写组件。JSX最终会被编译成React的createElement函数调用。

示例

<MyText color="red">  Hello, Good Morning!</MyText>

这段JSX代码会被编译成:

React.createElement(MyText, { color: 'red' }, 'Hello, Good Morning!');

注意:自定义组件的名称必须以大写字母开头,以区分于HTML元素,后者以小写字母开头。

4. JSX中的props

在JSX中,可以通过多种方式传递props:

JavaScript表达式作为Props

<SumComponent sum={1 + 2 + 3} />

这里,props.sum的值将被计算为6。

字符串Props

<TextComponent text={'Good Morning!'} />
<TextComponent text="Good Morning!" />
这两个例子是等效的,都设置了props.text为字符串"Good Morning!"。

Props的默认值

如果未为prop指定值,它默认为true

示例

<TextComponent prop />
<TextComponent prop={true} />
这两个例子也是等效的,都将props.prop设置为true

5 类组件

在React中,组件可以以类或函数的形式定义。类组件提供了一种面向对象的方式来构建React组件。

定义类组件的示例

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

在这个例子中,Greetings类继承自React.Component,并通过render方法返回其UI。

6 组件生命周期

React组件具有生命周期,这意味着组件在不同阶段会经历特定的方法调用。您可以在这些生命周期方法中执行代码,以响应组件状态的变化。

挂载(Mounting):当组件被创建并插入DOM时触发。

  • constructor():构造函数,用于初始化组件状态。

  • render():渲染方法,返回组件要渲染的输出。

  • componentDidMount():在组件挂载后执行,通常用于执行DOM操作或数据获取。

更新(Updating):当组件的props或state发生变化时触发。

  • render():再次调用,以响应props或state的变化。

  • componentDidUpdate():在更新后执行,用于处理DOM或执行其他副作用。

卸载(Unmounting):当组件从DOM中移除时触发。

  • componentWillUnmount():在组件卸载前执行,用于清理操作,如取消事件监听器或定时器。

7 类组件的默认Props

在React的类组件中,defaultProps可以为组件的props定义默认值。如果在使用组件时没有提供某些props,这些默认值将被使用。

设置默认Props的示例

class MyText extends React.Component {  // Component code here}
MyText.defaultProps = { color: 'gray'};

在这个例子中,如果在使用MyText组件时没有指定color属性,它将默认为'gray'

8 校验Props类型

使用prop-types库,我们可以定义组件的props应该具有的类型,并在类型不匹配时获得警告。这有助于确保组件接收到正确的数据类型。

使用PropTypes进行类型校验的示例

import PropTypes from 'prop-types';
class MyComponent extends React.Component { render() { // Component code here }}
MyComponent.propTypes = { studentName: PropTypes.string, id: PropTypes.number};
// 组件的props示例const props = { studentName: 'Asima', id: 'hi' // 这里应该是一个数字,而不是字符串};

在这个例子中,如果id被错误地传递为字符串而不是数字,prop-types将会在开发环境中发出警告,提示类型不匹配。

注意PropTypes.checkPropTypes方法在React 15.5版本后已被弃用,现在推荐直接在组件中声明propTypes。上述代码展示了如何在类组件中声明propTypes,以确保props的类型正确。

9 性能优化

React 旨在提供高性能的用户体验,但通过以下策略,您可以进一步提升应用的性能:

使用生产版本

在生产环境中,应使用React的优化版本。这可以通过构建命令实现:

npm run build
这将生成经过压缩和优化的生产代码。

代码拆分

通过代码拆分,可以将应用的JavaScript代码分割成多个包,这些包可以按需加载,从而减少初始加载时间。

最小化源代码

虽然通常不推荐修改React的源代码,但如果您确实需要这样做,请确保最小化和优化更改后的代码。

10 React Hooks

Hooks 是一种在函数组件中使用状态和其他React特性的机制。以下是两个最常用的Hooks:

useState

用于在函数组件中添加状态。以下是一个示例:

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

用于在函数组件中处理副作用,如数据获取、订阅或手动更改DOM。以下是一个示例:

import React, { useState, useEffect } from 'react';
function Example() { const [count, setCount] = useState(0);
useEffect(() => { document.title = `You clicked ${count} times`; }, [count]); // 仅在 count 变化时运行
return ( <div> <p>You clicked {count} times</p> <button onClick={() => setCount(count + 1)}>Click me</button> </div> );}

在这个例子中,useEffect 会在count变化时更新文档标题,确保副作用仅在依赖的值变化时执行。

11 小结

React 的持续发展使其成为现代Web开发的首选工具。掌握其核心概念对于构建高效、可扩展的应用程序至关重要。从理解React作为库的定位,到利用Hooks来构建功能丰富的组件,这些基础知识将为你精通React铺平道路。

随着你在项目中不断探索和应用React,记住,持续学习最新的实践和特性是保持技术领先地位的关键。如果你发现这篇文章有价值,不妨点赞并分享给其他渴望深化React知识的开发者。让我们一起推动Web开发的未来!


架构师之道
研究企业架构,研究企业数字化转型,跟踪和探索云计算、大数据、工业互联网、物联网、区块链等领域的最新动向和技术分享,帮助架构师进阶首席科学家!
 最新文章