2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
React est une bibliothèque JavaScript open source permettant de créer des interfaces utilisateur, développée et maintenue par Facebook. Depuis son lancement en open source en 2013, React est devenu un choix populaire pour le développement front-end et est largement utilisé dans le développement d'applications monopage (SPA) et d'applications complexes multipages. L'objectif principal de React est de simplifier le développement de l'interface utilisateur et de le rendre plus efficace, flexible et maintenable.
En résumé, par rapport aux opérations DOM traditionnelles, React fournit une méthode de développement plus efficace, maintenable et évolutive grâce à des fonctionnalités telles que le DOM virtuel, la composantisation et la programmation déclarative. Ces avantages font de React l’un des frameworks les plus répandus en matière de développement front-end et est largement utilisé dans des projets de toutes tailles et de tous types.
De manière générale, React et Vue.js sont tous deux d'excellents frameworks de développement front-end. Le choix du framework approprié dépend des exigences du projet, de la pile technologique de l'équipe et des préférences des développeurs. React peut être plus adapté aux applications volumineuses et complexes, en particulier aux scénarios qui nécessitent un haut degré de flexibilité et de personnalisation ; tandis que Vue.js est plus adapté au développement rapide et aux applications de petite et moyenne taille, offrant des solutions plus intégrées et plus pratiques.
shouldComponentUpdate
: Peut être utilisé dans les composants de classe shouldComponentUpdate
Méthode permettant de contrôler si le composant doit être restitué pour éviter les redessins et les redistributions inutiles.React.memo
Pour optimiser les performances, il comparera les propriétés avant et après, et ne restituera le composant que lorsque les propriétés changeront.useMemo
etuseCallback
: Fourni par Hooks useMemo
etuseCallback
Les résultats des calculs et les références de fonctions peuvent être mis en cache pour éviter les mises à jour inutiles des sous-composants.L'exemple suivant montre comment React peut transmettre React.memo
etuseMemo
Pour réduire le rendu inutile :
import React, { useState, useMemo } from 'react';
// 一个简单的子组件,仅在 props 变化时重新渲染
const ChildComponent = React.memo(({ value }) => {
console.log('ChildComponent render');
return <div>{value}</div>;
});
function App() {
const [count, setCount] = useState(0);
const [text, setText] = useState('');
// 使用 useMemo 缓存计算结果,避免不必要的计算
const memoizedValue = useMemo(() => {
console.log('Calculating memoized value');
return count * 2;
}, [count]);
return (
<div>
<h1>Count: {count}</h1>
<button onClick={() => setCount(count + 1)}>Increment</button>
<input
type="text"
value=
React基础学习-Day01
1.React介绍
1.1 react是什么?
React 是一个用于构建用户界面的开源 JavaScript 库,由 Facebook 开发和维护。自 2013 年开源以来,React 已成为前端开发的热门选择,广泛应用于单页应用(SPA)和复杂的多页应用的开发。React 的主要目标是简化 UI 开发,使其更加高效、灵活和可维护。
1.2 react的优势?
1.2.1 react对比DOM的优势体现
- 虚拟 DOM 和高效更新:
- 虚拟 DOM:React 使用虚拟 DOM 作为内存中的副本来表示 UI 结构。每次数据更新时,React 首先在虚拟 DOM 中进行计算和比较,然后再将变化的部分批量更新到实际 DOM 中。这种优化能够显著减少 DOM 操作,提升性能。
- 减少重绘和回流:通过虚拟 DOM,React 可以避免频繁地直接操作实际 DOM,减少页面重绘(repaint)和回流(reflow),从而提高页面的响应速度和性能。
- 组件化和可复用性:
- 组件化:React 鼓励将 UI 拆分为独立的组件,每个组件负责自己的 UI 和逻辑。这种模块化的设计使得开发者可以更容易地复用、测试和维护代码。
- 自定义组件:开发者可以创建自定义的组件,并通过组合这些组件来构建复杂的 UI。这种灵活性和可复用性是传统 DOM 操作所不具备的。
- 声明式编程风格:
- 声明式:React 的编程风格是声明式的,开发者只需描述 UI 应该是什么样子,而不需要关心如何操作 DOM 进行更新。这种方式更加直观和易于理解,提高了代码的可维护性。
- 数据驱动:React 强调通过状态(state)和属性(props)来驱动 UI 的变化,数据变化时,React 负责更新 UI,开发者无需手动操作 DOM。
- 跨平台能力:
- React Native:除了 Web 应用外,React 还支持使用相同的组件模型构建原生移动应用。React Native 提供了一种在 iOS 和 Android 上构建高性能、原生用户界面的方式,这使得开发者可以共享大部分代码和技能,减少开发成本和学习曲线。
- 社区和生态系统支持:
- 庞大的社区:React 拥有一个活跃和庞大的社区,提供了丰富的第三方库、工具和解决方案,帮助开发者更高效地开发和部署应用。
- 组件库:有许多优秀的 UI 组件库(如 Material-UI、Ant Design 等)和状态管理工具(如 Redux、MobX 等),可以与 React 配合使用,进一步提升开发效率和应用性能。
总结来说,React 相对于传统的 DOM 操作,通过虚拟 DOM、组件化、声明式编程等特性,提供了更高效、可维护和可扩展的开发方式。这些优势使得 React 成为前端开发中的主流框架之一,被广泛应用于各种规模和类型的项目中。
1.2.2 react与其他框架的对比
- 灵活性和可定制性:
- React:React 本身是一个库而非完整的框架,它更注重于提供构建用户界面的核心工具和机制,开发者可以自由选择配合使用其他库和工具(如 Redux、React Router 等)。这种灵活性使得开发者可以根据项目需求进行更精确的定制和优化。
- Vue.js:Vue.js 提供了更全面的解决方案,包括路由、状态管理和构建工具等,对于小型到中型应用,Vue.js 提供了更多开箱即用的功能,减少了集成和配置的复杂性。
- 虚拟 DOM 的实现:
- React:React 使用了一套高效的虚拟 DOM 和 diff 算法,这使得 React 在处理大型数据集合和频繁数据更新时性能表现优越。
- Vue.js:Vue.js 也使用了类似的虚拟 DOM 技术,但在一些测试中,React 的 diff 算法可能会更快一些,尤其是在处理复杂的 UI 更新时。
- 生态系统和社区支持:
- React:React 拥有一个庞大和活跃的社区,支持丰富的第三方库和工具,如 Redux、Material-UI 等,这些库能够帮助开发者构建复杂的单页应用和大型项目。
- Vue.js:Vue.js 社区同样非常活跃,Vue.js 生态系统提供了许多插件和工具,如 Vuex(状态管理)、Vue Router(路由管理)等,为开发者提供了更多的选择和集成方案。
- 学习曲线和易用性:
- React:React 的学习曲线相对较陡,特别是对于初学者来说,需要掌握 JSX、组件生命周期、状态管理等概念。但一旦掌握了 React 的核心概念,开发者可以更高效地构建和维护复杂的应用。
- Vue.js:Vue.js 的学习曲线相对平缓,它更接近传统的 HTML、CSS 和 JavaScript,对于有经验的开发者和新手来说都较为友好。Vue.js 的文档和教程也很全面,帮助开发者快速入门和上手。
- 社区文化和响应性:
- React:React 社区倾向于更加注重性能和灵活性,也更倾向于使用 TypeScript 等类型安全的技术栈。Facebook 作为 React 的主要维护者,对于安全性和稳定性有较高的保障。
- Vue.js:Vue.js 社区更加开放和友好,注重开发者体验和易用性。Vue.js 也更容易与其他技术栈集成,比如可以很方便地与现有的项目或库整合。
总体来说,React 和 Vue.js 都是优秀的前端开发框架,选择适合的框架取决于项目需求、团队技术栈和开发者的偏好。React 在大型和复杂的应用中可能更适合,特别是需要高度灵活性和可定制性的场景;而 Vue.js 则更适合于快速开发和中小型应用,提供了更多集成和便捷的解决方案。
1.2.3 react对比DOM如何减少重绘和重排
重绘 (Repaint) 和回流 (Reflow)
- 重绘 (Repaint):当元素的外观样式(如颜色、背景、可见性)发生变化,但不影响布局时,会触发重绘。
- 回流 (Reflow):当元素的尺寸、位置或结构发生变化,影响布局时,会触发回流。回流比重绘更耗费性能,因为需要重新计算布局和渲染树。
React 如何减少重绘和回流
- 虚拟 DOM (Virtual DOM):
- 虚拟 DOM:React 创建了一个虚拟 DOM,它是 UI 的轻量级副本,保存在内存中。每次组件的状态或属性发生变化时,React 会在虚拟 DOM 中进行计算和比较,生成新的虚拟 DOM 树。
- Diff 算法:React 使用高效的 diff 算法比较新旧虚拟 DOM 树,找出变化的部分,并生成一个更新补丁。
- 最小化实际 DOM 操作:
- 批量更新:React 将多个状态更新合并为一次批量更新,减少 DOM 操作次数。批量更新通过一次性更新多个变化,避免频繁操作 DOM 导致的性能损耗。
- 异步更新:React 通过异步批处理(例如 React 18 中引入的 Concurrent Mode),将多次状态更新合并处理,避免频繁的同步 DOM 操作。
- 避免不必要的更新:
shouldComponentUpdate
:类组件中可以使用 shouldComponentUpdate
方法来控制组件是否需要重新渲染,从而避免不必要的重绘和回流。- React.memo:函数组件可以使用
React.memo
进行性能优化,它会对比前后属性,只有属性变化时才会重新渲染组件。 useMemo
和 useCallback
:Hooks 提供的 useMemo
和 useCallback
可以缓存计算结果和函数引用,避免子组件不必要的更新。
- 合并更新:
- 批量状态更新:React 会自动合并多次状态更新,在一次事件循环内只触发一次渲染,从而减少 DOM 操作。
示例代码
以下示例演示了 React 如何通过 React.memo
和 useMemo
来减少不必要的渲染:
import React, { useState, useMemo } from 'react';
// 一个简单的子组件,仅在 props 变化时重新渲染
const ChildComponent = React.memo(({ value }) => {
console.log('ChildComponent render');
return <div>{value}</div>;
});
function App() {
const [count, setCount] = useState(0);
const [text, setText] = useState('');
// 使用 useMemo 缓存计算结果,避免不必要的计算
const memoizedValue = useMemo(() => {
console.log('Calculating memoized value');
return count * 2;
}, [count]);
return (
<div>
<h1>Count: {count}</h1>
<button onClick={() => setCount(count + 1)}>Increment</button>
<input
type="text"
value={text}
onChange={(e) => setText(e.target.value)}
/>
<ChildComponent value={memoizedValue} />
</div>
);
}
export default App;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
在这个示例中:
ChildComponent
只有在 value
变化时才会重新渲染,因为它被 React.memo
包裹。memoizedValue
使用 useMemo
进行缓存,只有在 count
变化时才会重新计算,避免了不必要的计算和渲染。通过虚拟 DOM、批量更新、避免不必要的更新和合并更新,React 有效地减少了重绘和回流的次数,从而提升了应用的性能。与传统的直接操作 DOM 的方式相比,React 提供了一种更加高效和优化的 UI 更新机制。
.jsx
是 JavaScript XML 的缩写,它是一种 JavaScript 的语法扩展,允许开发者在 JavaScript 中直接编写类似 HTML 的标记语言,用于定义 React 组件的 UI 结构。以下是一些 .jsx
语法的核心特点和使用方法:
.jsx
允许在 JavaScript 中嵌入类似 HTML 的标记语言,用于声明 UI 的结构和组件的外观。<div>
、<span>
、<h1>
等 HTML 标签,以及自定义的 React 组件。.jsx
中,可以使用 {}
花括号来包裹 JavaScript 表达式,用于在标记中动态地插入变量、计算结果或函数调用。.jsx
具有了 JavaScript 的全部表达能力,可以进行条件判断、循环、计算等操作。.jsx
允许在标签上使用属性,并支持使用表达式作为属性值。<Component name={variable} />
,其中 name
是一个属性,variable
是一个 JavaScript 变量或表达式。.jsx
中的标签可以是自闭合的,比如 <img>
、<input>
,也可以使用 /
符号来表示自闭合,例如 <br />
。//
单行注释和 /* */
多行注释在 .jsx
文件中添加注释(注释要写在{}内)。以下是一个简单的 React 组件示例,展示了 .jsx
的基本语法和特点:
import React from 'react';
// 定义一个 React 函数组件
const MyComponent = () => {
const name = 'World';
return (
<div>
<h1>Hello, {name}!</h1>
<p>Welcome to JSX!</p>
<ul>
{['apple', 'banana', 'cherry'].map((fruit, index) => (
<li key={index}>{fruit}</li>
))}
</ul>
</div>
);
};
export default MyComponent;
在这个例子中:
<h1>
、<p>
、<ul>
和 <li>
等标签直接在 JavaScript 函数中使用,用于构建组件的 UI 结构。{name}
在 <h1>
中动态地插入变量 name
的值。{}
花括号包裹的 JavaScript 表达式,例如 ['apple', 'banana', 'cherry'].map()
来生成列表项 <li>
。key={index}
用于在 React 中标识列表项的唯一性,帮助 React 更高效地管理组件的更新。总结来说,.jsx
是 React 中用于定义组件 UI 结构的一种语法扩展,它结合了 JavaScript 的表达能力和 HTML 标记的直观性,是开发现代 Web 应用的重要工具之一。
import React from 'react';
const MyComponent = () => {
// 假设我们有一个水果列表
const fruits = ['apple', 'banana', 'cherry'];
return (
<div>
<h2>Fruit List:</h2>
<ul>
{/* 使用 map 方法遍历数组,并为每个元素生成一个 <li> 元素 */}
{fruits.map((fruit, index) => (
<li key={index}>{fruit}</li>
))}
</ul>
</div>
);
};
export default MyComponent;
这是最常用的方式,通过三元运算符来实现简单的条件渲染。
import React from 'react';
const MyComponent = () => {
const isLoggedIn = true;
return (
<div>
{isLoggedIn ? <p>Welcome back!</p> : <p>Please sign in.</p>}
</div>
);
};
export default MyComponent;
适用于条件为真时才渲染内容的场景。
import React from 'react';
const MyComponent = () => {
const isLoggedIn = true;
return (
<div>
{isLoggedIn && <p>Welcome back!</p>}
</div>
);
};
export default MyComponent;
适用于需要执行更多逻辑或多条件判断的情况。
import React from 'react';
const MyComponent = () => {
const status = 'loggedOut'; // 可以是 'loggedIn' 或 'loggedOut'
return (
<div>
{(() => {
if (status === 'loggedIn') {
return <p>Welcome back!</p>;
} else if (status === 'loggedOut') {
return <p>Please sign in.</p>;
} else {
return <p>Status unknown.</p>;
}
})()}
</div>
);
};
export default MyComponent;
将条件渲染逻辑封装到单独的组件中,可以提高代码的可读性和复用性。
import React from 'react';
const Greeting = ({ isLoggedIn }) => {
if (isLoggedIn) {
return <p>Welcome back!</p>;
} else {
return <p>Please sign in.</p>;
}
};
const MyComponent = () => {
const isLoggedIn = true;
return (
<div>
<Greeting isLoggedIn={isLoggedIn} />
</div>
);
};
export default MyComponent;
在 React 中,可以直接在 JSX 中通过类似 HTML 的方式来绑定事件处理函数。例如,给按钮绑定点击事件:
import React from 'react';
const MyComponent = () => {
const handleClick = () => {
console.log('Button clicked!');
};
return (
<div>
<button onClick={handleClick}>Click me</button>
</div>
);
};
export default MyComponent;
在这个例子中,onClick
是 React 的事件属性,它接收一个函数作为值。当按钮被点击时,handleClick
函数会被调用。
React 的事件处理函数与普通的 JavaScript 事件处理函数类似,它们接收一个合成事件对象 (SyntheticEvent),而不是原生 DOM 事件对象。这使得跨浏览器的事件处理更加一致和可靠。
import React from 'react';
const MyComponent = () => {
const handleClick = (event) => {
console.log('Button clicked!', event.target);
};
return (
<div>
<button onClick={handleClick}>Click me</button>
</div>
);
};
export default MyComponent;
在上面的示例中,handleClick
函数的参数 event
是一个合成事件对象,可以通过 event.target
访问触发事件的 DOM 元素。
有时候需要给事件处理函数传递额外的参数。可以使用箭头函数或者 bind
方法来实现这一点。
使用箭头函数:
import React from 'react';
const MyComponent = () => {
const handleClick = (name) => {
console.log(`Hello, ${name} clicked!`);
};
return (
<div>
<button onClick={() => handleClick('World')}>Click me</button>
</div>
);
};
export default MyComponent;
使用 bind
方法:
import React from 'react';
const MyComponent = () => {
const handleClick = (name) => {
console.log(`Hello, ${name} clicked!`);
};
return (
<div>
<button onClick={handleClick.bind(null, 'World')}>Click me</button>
</div>
);
};
export default MyComponent;
这两种方式都可以将 'World'
作为参数传递给 handleClick
函数。
在 React 中,阻止事件的默认行为和冒泡可以通过合成事件对象的方法来实现。
阻止默认行为:
import React from 'react';
const MyComponent = () => {
const handleClick = (event) => {
event.preventDefault();
console.log('Button clicked!');
};
return (
<div>
<a href="#" onClick={handleClick}>Click me</a>
</div>
);
};
export default MyComponent;
阻止冒泡:
import React from 'react';
const MyComponent = () => {
const handleClick = (event) => {
event.stopPropagation();
console.log('Button clicked!');
};
return (
<div onClick={() => console.log('Div clicked!')}>
<button onClick={handleClick}>Click me</button>
</div>
);
};
export default MyComponent;
React 的事件绑定和处理与传统的 JavaScript 事件处理有些许差异,主要体现在事件对象的处理上,使用合成事件对象来实现跨浏览器一致性。通过上述方法,可以有效地在 React 中处理各种事件,并进行事件传参、阻止默认行为和冒泡等操作。
在 React 中,组件是构建用户界面的基本单位,可以将 UI 分割成独立的、可复用的代码片段。组件可以是函数组件或类组件,它们可以接收输入的数据(称为 props)并返回描述页面展示内容的 React 元素。组件可以包含其他组件、HTML 标签和逻辑,使得复杂的 UI 可以被有效地管理和开发。
componentDidMount
、componentDidUpdate
和 componentWillUnmount
等,用于在组件生命周期不同阶段执行特定的逻辑。以下是一个简单的 React 函数组件的示例,展示了一个名为 HelloWorld
的组件,它接收一个 name
属性作为输入,并渲染一个简单的问候语句:
import React from 'react';
// 函数组件:HelloWorld
const HelloWorld = ({ name }) => {
return (
<div>
<h1>Hello, {name}!</h1>
<p>Welcome to React components.</p>
</div>
);
};
export default HelloWorld;
在这个例子中,HelloWorld
组件接收一个 name
属性,用于动态显示问候语。这种组件可以被多次使用,每次使用时传入不同的 name
属性,使得界面呈现的问候语可以个性化定制。
总之,React 组件是构建现代 Web 应用的核心概念之一,它们通过组合和抽象,使得开发者可以更加高效和灵活地构建用户界面。
useState
是 React 中的一个 Hook,用于在函数组件中添加状态管理功能。它允许你在函数组件中声明状态变量,并提供一个方法来更新这些状态。
useState
是从 React 中导入的,并且通常在函数组件的顶部进行调用。它返回一个包含两个元素的数组:当前状态值和一个更新状态的函数。
import React, { useState } from 'react';
const Counter = () => {
// 声明一个名为 "count" 的状态变量,初始值为 0
const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
};
export default Counter;
在这个示例中:
const [count, setCount] = useState(0);
声明了一个名为 count
的状态变量,初始值为 0
。useState
返回一个数组,第一个元素是当前状态值(count
),第二个元素是更新状态的函数(setCount
)。setCount(count + 1)
更新 count
的值,从而触发组件的重新渲染,并更新显示的点击次数。你可以在一个组件中使用多个 useState
调用来管理不同的状态变量:
import React, { useState } from 'react';
const MultiStateComponent = () => {
const [count, setCount] = useState(0);
const [text, setText] = useState('');
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
<input
type="text"
value={text}
onChange={(e) => setText(e.target.value)}
placeholder="Type something..."
/>
<p>You typed: {text}</p>
</div>
);
};
export default MultiStateComponent;
在这个示例中,我们使用了两个 useState
调用来分别管理 count
和 text
两个状态变量。
你可以将状态的初始值设置为函数返回的值,这在初始化需要执行复杂计算时特别有用:
import React, { useState } from 'react';
const ExpensiveComponent = () => {
const initialCount = () => {
// 模拟一个复杂的计算
return 42;
};
const [count, setCount] = useState(initialCount);
return (
<div>
<p>Initial count: {count}</p>
<button onClick={() => setCount(count + 1)}>
Increment
</button>
</div>
);
};
export default ExpensiveComponent;
在这个示例中,initialCount
函数只会在组件初次渲染时执行一次,用于计算初始状态值。
useState
是一个 React Hook,用于在函数组件中添加状态管理功能。useState
返回一个包含当前状态值和一个更新状态的函数的数组。useState
调用来管理多个状态变量。在 React 中,使用 useState
来管理和修改状态时,有一些规则和最佳实践需要遵循,以确保状态的管理和更新过程是高效和可靠的。以下是修改状态的主要规则和一些示例:
React 的状态更新是异步的,这意味着调用状态更新函数后,状态的更新不会立即反映出来,而是在下一次重新渲染时才会生效。
import React, { useState } from 'react';
const Counter = () => {
const [count, setCount] = useState(0);
const handleClick = () => {
setCount(count + 1);
console.log(count); // 这里的 count 可能不会立即更新
};
return (
<div>
<p>{count}</p>
<button onClick={handleClick}>Increment</button>
</div>
);
};
export default Counter;
在上述例子中,console.log(count)
可能不会立即显示更新后的值,因为状态更新是异步的。
为了确保状态更新时使用的值是最新的,可以传递一个函数给状态更新函数。这个函数会接收当前的状态值作为参数。
import React, { useState } from 'react';
const Counter = () => {
const [count, setCount] = useState(0);
const handleClick = () => {
setCount(prevCount => prevCount + 1);
};
return (
<div>
<p>{count}</p>
<button onClick={handleClick}>Increment</button>
</div>
);
};
export default Counter;
在这个示例中,setCount
接收一个函数 prevCount => prevCount + 1
,确保使用的是最新的状态值进行更新。
状态应该是不可变的,不要直接修改状态对象,而是通过创建新对象来更新状态。
import React, { useState } from 'react';
const Example = () => {
const [user, setUser] = useState({ name: 'John', age: 30 });
const updateAge = () => {
setUser(prevUser => ({
...prevUser,
age: prevUser.age + 1
}));
};
return (
<div>
<p>{user.name}</p>
<p>{user.age}</p>
<button onClick={updateAge}>Increment Age</button>
</div>
);
};
export default Example;
在这个示例中,使用扩展运算符 ...prevUser
创建了一个新的用户对象,并更新了年龄属性。
对于对象类型的状态,需要手动合并更新的部分,因为 useState
不会自动合并更新对象。
import React, { useState } from 'react';
const Example = () => {
const [user, setUser] = useState({ name: 'John', age: 30 });
const updateName = () => {
setUser(prevUser => ({
...prevUser,
name: 'Doe'
}));
};
return (
<div>
<p>{user.name}</p>
<p>{user.age}</p>
<button onClick={updateName}>Update Name</button>
</div>
);
};
export default Example;
在这个示例中,setUser
的更新函数创建了一个新的用户对象,同时保持其他属性不变。
尽量避免在每次渲染中都调用状态更新函数,只有在需要时才更新状态,以提高性能。
import React, { useState } from 'react';
const Example = () => {
const [count, setCount] = useState(0);
const handleClick = () => {
if (count < 10) {
setCount(count + 1);
}
};
return (
<div>
<p>{count}</p>
<button onClick={handleClick}>Increment</button>
</div>
);
};
export default Example;
在这个示例中,只有在 count
小于 10 时才会更新状态,避免了不必要的状态更新。
Dans cet exemple :
ChildComponent
seulement àvalue
Il ne sera restitué que lorsqu'il changera, car il estReact.memo
paquet.memoizedValue
utiliseruseMemo
Cache, seulement sicount
Il sera recalculé uniquement lorsqu'il changera, évitant ainsi les calculs et les rendus inutiles.Grâce au DOM virtuel, aux mises à jour par lots, en évitant les mises à jour inutiles et en fusionnant les mises à jour, React réduit efficacement le nombre de redessins et de redistributions, améliorant ainsi les performances des applications. Par rapport à la manière traditionnelle de manipuler directement le DOM, React fournit un mécanisme de mise à jour de l'interface utilisateur plus efficace et optimisé.
.jsx
OuiXML JavaScript L'abréviation de , il s'agit d'une extension de syntaxe de JavaScript qui permet aux développeurs d'écrire directement un langage de balisage de type HTML en JavaScript pour définir la structure de l'interface utilisateur des composants React.Voilà quelque.jsx
Les principales fonctionnalités et l'utilisation de la grammaire :
.jsx
Permet d'intégrer un langage de balisage de type HTML dans JavaScript pour déclarer la structure de l'interface utilisateur et l'apparence des composants.<div>
、<span>
、<h1>
Balises HTML et composants React personnalisés..jsx
dans, peut être utilisé{}
Les accolades sont utilisées pour encapsuler les expressions JavaScript et pour insérer dynamiquement des variables, des résultats de calcul ou des appels de fonction dans le balisage..jsx
Il possède toutes les capacités d'expression de JavaScript et peut effectuer des opérations telles que le jugement conditionnel, le bouclage et le calcul..jsx
Permet l'utilisation d'attributs sur les étiquettes et prend en charge les expressions comme valeurs d'attribut.<Component name={variable} />
,dans name
est un attribut,variable
est une variable ou une expression JavaScript..jsx
Les étiquettes peuvent se fermer automatiquement, comme<img>
、<input>
, vous pouvez aussi utiliser /
symbole pour représenter la fermeture automatique, par ex.<br />
。//
commentaires sur une seule ligne et/* */
Commentaires sur plusieurs lignes dans.jsx
Ajouter des commentaires au fichier (Les commentaires doivent être rédigés entre {})。Voici un exemple simple de composant React montrant .jsx
Syntaxe et fonctionnalités de base :
import React from 'react';
// 定义一个 React 函数组件
const MyComponent = () => {
const name = 'World';
return (
<div>
<h1>Hello, {name}!</h1>
<p>Welcome to JSX!</p>
<ul>
{['apple', 'banana', 'cherry'].map((fruit, index) => (
<li key={index}>{fruit}</li>
))}
</ul>
</div>
);
};
export default MyComponent;
Dans cet exemple :
<h1>
、<p>
、<ul>
et<li>
Des balises telles que celles-ci sont utilisées directement dans les fonctions JavaScript pour créer la structure d'interface utilisateur du composant.{name}
exister<h1>
Insérer dynamiquement des variables dansname
valeur.{}
Expressions JavaScript entourées d'accolades, par exemple['apple', 'banana', 'cherry'].map()
pour générer des éléments de liste<li>
。key={index}
Utilisé pour identifier de manière unique les éléments de liste dans React, aidant ainsi React à gérer plus efficacement les mises à jour des composants.En conclusion,.jsx
Il s'agit d'une extension de syntaxe utilisée dans React pour définir la structure de l'interface utilisateur des composants. Elle combine la puissance expressive de JavaScript et l'intuitivité des balises HTML. C'est l'un des outils importants pour développer des applications Web modernes.
import React from 'react';
const MyComponent = () => {
// 假设我们有一个水果列表
const fruits = ['apple', 'banana', 'cherry'];
return (
<div>
<h2>Fruit List:</h2>
<ul>
{/* 使用 map 方法遍历数组,并为每个元素生成一个 <li> 元素 */}
{fruits.map((fruit, index) => (
<li key={index}>{fruit}</li>
))}
</ul>
</div>
);
};
export default MyComponent;
Il s'agit de la manière la plus courante d'implémenter un rendu conditionnel simple via l'opérateur ternaire.
import React from 'react';
const MyComponent = () => {
const isLoggedIn = true;
return (
<div>
{isLoggedIn ? <p>Welcome back!</p> : <p>Please sign in.</p>}
</div>
);
};
export default MyComponent;
Applicable aux scénarios dans lesquels le contenu est rendu uniquement lorsque la condition est vraie.
import React from 'react';
const MyComponent = () => {
const isLoggedIn = true;
return (
<div>
{isLoggedIn && <p>Welcome back!</p>}
</div>
);
};
export default MyComponent;
Convient aux situations où un jugement plus logique ou multi-conditions doit être effectué.
import React from 'react';
const MyComponent = () => {
const status = 'loggedOut'; // 可以是 'loggedIn' 或 'loggedOut'
return (
<div>
{(() => {
if (status === 'loggedIn') {
return <p>Welcome back!</p>;
} else if (status === 'loggedOut') {
return <p>Please sign in.</p>;
} else {
return <p>Status unknown.</p>;
}
})()}
</div>
);
};
export default MyComponent;
L'encapsulation de la logique de rendu conditionnel dans des composants distincts peut améliorer la lisibilité et la réutilisation du code.
import React from 'react';
const Greeting = ({ isLoggedIn }) => {
if (isLoggedIn) {
return <p>Welcome back!</p>;
} else {
return <p>Please sign in.</p>;
}
};
const MyComponent = () => {
const isLoggedIn = true;
return (
<div>
<Greeting isLoggedIn={isLoggedIn} />
</div>
);
};
export default MyComponent;
Dans React, les gestionnaires d'événements peuvent être liés directement dans JSX à la manière du HTML. Par exemple, liez un événement de clic à un bouton :
import React from 'react';
const MyComponent = () => {
const handleClick = () => {
console.log('Button clicked!');
};
return (
<div>
<button onClick={handleClick}>Click me</button>
</div>
);
};
export default MyComponent;
Dans cet exemple,onClick
Est une propriété d'événement de React qui reçoit une fonction comme valeur. Lorsque le bouton est cliqué,handleClick
La fonction sera appelée.
Les fonctions de gestion d'événements de React sont similaires aux fonctions de gestion d'événements JavaScript ordinaires. Elles reçoivent un objet d'événement synthétique (SyntheticEvent) au lieu d'un objet d'événement DOM natif. Cela rend la gestion des événements dans les navigateurs plus cohérente et fiable.
import React from 'react';
const MyComponent = () => {
const handleClick = (event) => {
console.log('Button clicked!', event.target);
};
return (
<div>
<button onClick={handleClick}>Click me</button>
</div>
);
};
export default MyComponent;
Dans l'exemple ci-dessus,handleClick
paramètres de fonctionevent
est un objet événement synthétique qui peut être transmisevent.target
Accédez à l'élément DOM qui a déclenché l'événement.
Parfois, il est nécessaire de transmettre des paramètres supplémentaires à la fonction de gestionnaire d'événements.Vous pouvez utiliser les fonctions fléchées oubind
méthode pour y parvenir.
Utilisez les fonctions fléchées :
import React from 'react';
const MyComponent = () => {
const handleClick = (name) => {
console.log(`Hello, ${name} clicked!`);
};
return (
<div>
<button onClick={() => handleClick('World')}>Click me</button>
</div>
);
};
export default MyComponent;
utiliser bind
méthode:
import React from 'react';
const MyComponent = () => {
const handleClick = (name) => {
console.log(`Hello, ${name} clicked!`);
};
return (
<div>
<button onClick={handleClick.bind(null, 'World')}>Click me</button>
</div>
);
};
export default MyComponent;
Ces deux méthodes peuvent être 'World'
passé en paramètre àhandleClick
fonction.
Dans React, il est possible d'empêcher le comportement par défaut et la propagation des événements grâce à des méthodes d'objets d'événement synthétiques.
Empêcher le comportement par défaut :
import React from 'react';
const MyComponent = () => {
const handleClick = (event) => {
event.preventDefault();
console.log('Button clicked!');
};
return (
<div>
<a href="#" onClick={handleClick}>Click me</a>
</div>
);
};
export default MyComponent;
Arrêtez de bouillonner :
import React from 'react';
const MyComponent = () => {
const handleClick = (event) => {
event.stopPropagation();
console.log('Button clicked!');
};
return (
<div onClick={() => console.log('Div clicked!')}>
<button onClick={handleClick}>Click me</button>
</div>
);
};
export default MyComponent;
La liaison et le traitement des événements de React sont légèrement différents du traitement des événements JavaScript traditionnel, principalement reflété dans le traitement des objets d'événement, utilisant des objets d'événement synthétiques pour obtenir une cohérence entre navigateurs. Grâce à la méthode ci-dessus, divers événements peuvent être traités efficacement dans React, et des opérations telles que le passage de paramètres d'événement, empêchant le comportement par défaut et le bouillonnement peuvent être effectuées.
Dans React, les composants sont les unités de base pour créer des interfaces utilisateur, et l'interface utilisateur peut être divisée enExtraits de code indépendants et réutilisables . Les composants peuvent être des composants de fonction ou des composants de classe qui reçoivent des données d'entrée (appelées accessoires) et renvoient des éléments React qui décrivent le contenu affiché sur la page. Les composants peuvent contenir d'autres composants, des balises HTML et une logique afin que les interfaces utilisateur complexes puissent être gérées et développées efficacement.
componentDidMount
、componentDidUpdate
etcomponentWillUnmount
etc., utilisés pour exécuter une logique spécifique à différentes étapes du cycle de vie des composants.Voici un exemple de composant de fonction React simple, montrant un composant appelé HelloWorld
composant, qui reçoit unname
attribut en entrée et affiche une simple déclaration de salutation :
import React from 'react';
// 函数组件:HelloWorld
const HelloWorld = ({ name }) => {
return (
<div>
<h1>Hello, {name}!</h1>
<p>Welcome to React components.</p>
</div>
);
};
export default HelloWorld;
Dans cet exemple,HelloWorld
Le composant reçoit unname
Propriété pour afficher dynamiquement les salutations.Ce composant peut être utilisé plusieurs fois, en transmettant des valeurs différentes à chaque utilisation.name
Les attributs permettent de personnaliser le message d'accueil affiché sur l'interface.
En bref, les composants React sont l'un des concepts fondamentaux pour la création d'applications Web modernes. Grâce à la composition et à l'abstraction, ils permettent aux développeurs de créer des interfaces utilisateur de manière plus efficace et plus flexible.
useState
Il s'agit d'un Hook dans React, utilisé pour ajouter une fonctionnalité de gestion d'état aux composants de fonction. Il permet de déclarer des variables d'état dans des composants fonctionnels et fournit une méthode pour mettre à jour ces états.
useState
est importé de React et est généralement appelé en haut d'un composant fonctionnel. Il renvoie un tableau contenant deux éléments : la valeur de l'état actuel et une fonction qui met à jour l'état.
import React, { useState } from 'react';
const Counter = () => {
// 声明一个名为 "count" 的状态变量,初始值为 0
const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
};
export default Counter;
Dans cet exemple :
const [count, setCount] = useState(0);
déclare un fichier nommécount
La variable d'état de , la valeur initiale est0
。useState
Renvoie un tableau, le premier élément est la valeur d'état actuelle (count
), le deuxième élément est la fonction qui met à jour l'état (setCount
)。setCount(count + 1)
renouvelercount
valeur, déclenchant un nouveau rendu du composant et mettant à jour le nombre de clics affiché.Vous pouvez utiliser plusieurs useState
Appelé pour gérer différentes variables d'état :
import React, { useState } from 'react';
const MultiStateComponent = () => {
const [count, setCount] = useState(0);
const [text, setText] = useState('');
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
<input
type="text"
value=
React基础学习-Day01
1.React介绍
1.1 react是什么?
React 是一个用于构建用户界面的开源 JavaScript 库,由 Facebook 开发和维护。自 2013 年开源以来,React 已成为前端开发的热门选择,广泛应用于单页应用(SPA)和复杂的多页应用的开发。React 的主要目标是简化 UI 开发,使其更加高效、灵活和可维护。
1.2 react的优势?
1.2.1 react对比DOM的优势体现
- 虚拟 DOM 和高效更新:
- 虚拟 DOM:React 使用虚拟 DOM 作为内存中的副本来表示 UI 结构。每次数据更新时,React 首先在虚拟 DOM 中进行计算和比较,然后再将变化的部分批量更新到实际 DOM 中。这种优化能够显著减少 DOM 操作,提升性能。
- 减少重绘和回流:通过虚拟 DOM,React 可以避免频繁地直接操作实际 DOM,减少页面重绘(repaint)和回流(reflow),从而提高页面的响应速度和性能。
- 组件化和可复用性:
- 组件化:React 鼓励将 UI 拆分为独立的组件,每个组件负责自己的 UI 和逻辑。这种模块化的设计使得开发者可以更容易地复用、测试和维护代码。
- 自定义组件:开发者可以创建自定义的组件,并通过组合这些组件来构建复杂的 UI。这种灵活性和可复用性是传统 DOM 操作所不具备的。
- 声明式编程风格:
- 声明式:React 的编程风格是声明式的,开发者只需描述 UI 应该是什么样子,而不需要关心如何操作 DOM 进行更新。这种方式更加直观和易于理解,提高了代码的可维护性。
- 数据驱动:React 强调通过状态(state)和属性(props)来驱动 UI 的变化,数据变化时,React 负责更新 UI,开发者无需手动操作 DOM。
- 跨平台能力:
- React Native:除了 Web 应用外,React 还支持使用相同的组件模型构建原生移动应用。React Native 提供了一种在 iOS 和 Android 上构建高性能、原生用户界面的方式,这使得开发者可以共享大部分代码和技能,减少开发成本和学习曲线。
- 社区和生态系统支持:
- 庞大的社区:React 拥有一个活跃和庞大的社区,提供了丰富的第三方库、工具和解决方案,帮助开发者更高效地开发和部署应用。
- 组件库:有许多优秀的 UI 组件库(如 Material-UI、Ant Design 等)和状态管理工具(如 Redux、MobX 等),可以与 React 配合使用,进一步提升开发效率和应用性能。
总结来说,React 相对于传统的 DOM 操作,通过虚拟 DOM、组件化、声明式编程等特性,提供了更高效、可维护和可扩展的开发方式。这些优势使得 React 成为前端开发中的主流框架之一,被广泛应用于各种规模和类型的项目中。
1.2.2 react与其他框架的对比
- 灵活性和可定制性:
- React:React 本身是一个库而非完整的框架,它更注重于提供构建用户界面的核心工具和机制,开发者可以自由选择配合使用其他库和工具(如 Redux、React Router 等)。这种灵活性使得开发者可以根据项目需求进行更精确的定制和优化。
- Vue.js:Vue.js 提供了更全面的解决方案,包括路由、状态管理和构建工具等,对于小型到中型应用,Vue.js 提供了更多开箱即用的功能,减少了集成和配置的复杂性。
- 虚拟 DOM 的实现:
- React:React 使用了一套高效的虚拟 DOM 和 diff 算法,这使得 React 在处理大型数据集合和频繁数据更新时性能表现优越。
- Vue.js:Vue.js 也使用了类似的虚拟 DOM 技术,但在一些测试中,React 的 diff 算法可能会更快一些,尤其是在处理复杂的 UI 更新时。
- 生态系统和社区支持:
- React:React 拥有一个庞大和活跃的社区,支持丰富的第三方库和工具,如 Redux、Material-UI 等,这些库能够帮助开发者构建复杂的单页应用和大型项目。
- Vue.js:Vue.js 社区同样非常活跃,Vue.js 生态系统提供了许多插件和工具,如 Vuex(状态管理)、Vue Router(路由管理)等,为开发者提供了更多的选择和集成方案。
- 学习曲线和易用性:
- React:React 的学习曲线相对较陡,特别是对于初学者来说,需要掌握 JSX、组件生命周期、状态管理等概念。但一旦掌握了 React 的核心概念,开发者可以更高效地构建和维护复杂的应用。
- Vue.js:Vue.js 的学习曲线相对平缓,它更接近传统的 HTML、CSS 和 JavaScript,对于有经验的开发者和新手来说都较为友好。Vue.js 的文档和教程也很全面,帮助开发者快速入门和上手。
- 社区文化和响应性:
- React:React 社区倾向于更加注重性能和灵活性,也更倾向于使用 TypeScript 等类型安全的技术栈。Facebook 作为 React 的主要维护者,对于安全性和稳定性有较高的保障。
- Vue.js:Vue.js 社区更加开放和友好,注重开发者体验和易用性。Vue.js 也更容易与其他技术栈集成,比如可以很方便地与现有的项目或库整合。
总体来说,React 和 Vue.js 都是优秀的前端开发框架,选择适合的框架取决于项目需求、团队技术栈和开发者的偏好。React 在大型和复杂的应用中可能更适合,特别是需要高度灵活性和可定制性的场景;而 Vue.js 则更适合于快速开发和中小型应用,提供了更多集成和便捷的解决方案。
1.2.3 react对比DOM如何减少重绘和重排
重绘 (Repaint) 和回流 (Reflow)
- 重绘 (Repaint):当元素的外观样式(如颜色、背景、可见性)发生变化,但不影响布局时,会触发重绘。
- 回流 (Reflow):当元素的尺寸、位置或结构发生变化,影响布局时,会触发回流。回流比重绘更耗费性能,因为需要重新计算布局和渲染树。
React 如何减少重绘和回流
- 虚拟 DOM (Virtual DOM):
- 虚拟 DOM:React 创建了一个虚拟 DOM,它是 UI 的轻量级副本,保存在内存中。每次组件的状态或属性发生变化时,React 会在虚拟 DOM 中进行计算和比较,生成新的虚拟 DOM 树。
- Diff 算法:React 使用高效的 diff 算法比较新旧虚拟 DOM 树,找出变化的部分,并生成一个更新补丁。
- 最小化实际 DOM 操作:
- 批量更新:React 将多个状态更新合并为一次批量更新,减少 DOM 操作次数。批量更新通过一次性更新多个变化,避免频繁操作 DOM 导致的性能损耗。
- 异步更新:React 通过异步批处理(例如 React 18 中引入的 Concurrent Mode),将多次状态更新合并处理,避免频繁的同步 DOM 操作。
- 避免不必要的更新:
shouldComponentUpdate
:类组件中可以使用 shouldComponentUpdate
方法来控制组件是否需要重新渲染,从而避免不必要的重绘和回流。- React.memo:函数组件可以使用
React.memo
进行性能优化,它会对比前后属性,只有属性变化时才会重新渲染组件。 useMemo
和 useCallback
:Hooks 提供的 useMemo
和 useCallback
可以缓存计算结果和函数引用,避免子组件不必要的更新。
- 合并更新:
- 批量状态更新:React 会自动合并多次状态更新,在一次事件循环内只触发一次渲染,从而减少 DOM 操作。
示例代码
以下示例演示了 React 如何通过 React.memo
和 useMemo
来减少不必要的渲染:
import React, { useState, useMemo } from 'react';
// 一个简单的子组件,仅在 props 变化时重新渲染
const ChildComponent = React.memo(({ value }) => {
console.log('ChildComponent render');
return <div>{value}</div>;
});
function App() {
const [count, setCount] = useState(0);
const [text, setText] = useState('');
// 使用 useMemo 缓存计算结果,避免不必要的计算
const memoizedValue = useMemo(() => {
console.log('Calculating memoized value');
return count * 2;
}, [count]);
return (
<div>
<h1>Count: {count}</h1>
<button onClick={() => setCount(count + 1)}>Increment</button>
<input
type="text"
value={text}
onChange={(e) => setText(e.target.value)}
/>
<ChildComponent value={memoizedValue} />
</div>
);
}
export default App;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
在这个示例中:
ChildComponent
只有在 value
变化时才会重新渲染,因为它被 React.memo
包裹。memoizedValue
使用 useMemo
进行缓存,只有在 count
变化时才会重新计算,避免了不必要的计算和渲染。通过虚拟 DOM、批量更新、避免不必要的更新和合并更新,React 有效地减少了重绘和回流的次数,从而提升了应用的性能。与传统的直接操作 DOM 的方式相比,React 提供了一种更加高效和优化的 UI 更新机制。
.jsx
是 JavaScript XML 的缩写,它是一种 JavaScript 的语法扩展,允许开发者在 JavaScript 中直接编写类似 HTML 的标记语言,用于定义 React 组件的 UI 结构。以下是一些 .jsx
语法的核心特点和使用方法:
.jsx
允许在 JavaScript 中嵌入类似 HTML 的标记语言,用于声明 UI 的结构和组件的外观。<div>
、<span>
、<h1>
等 HTML 标签,以及自定义的 React 组件。.jsx
中,可以使用 {}
花括号来包裹 JavaScript 表达式,用于在标记中动态地插入变量、计算结果或函数调用。.jsx
具有了 JavaScript 的全部表达能力,可以进行条件判断、循环、计算等操作。.jsx
允许在标签上使用属性,并支持使用表达式作为属性值。<Component name={variable} />
,其中 name
是一个属性,variable
是一个 JavaScript 变量或表达式。.jsx
中的标签可以是自闭合的,比如 <img>
、<input>
,也可以使用 /
符号来表示自闭合,例如 <br />
。//
单行注释和 /* */
多行注释在 .jsx
文件中添加注释(注释要写在{}内)。以下是一个简单的 React 组件示例,展示了 .jsx
的基本语法和特点:
import React from 'react';
// 定义一个 React 函数组件
const MyComponent = () => {
const name = 'World';
return (
<div>
<h1>Hello, {name}!</h1>
<p>Welcome to JSX!</p>
<ul>
{['apple', 'banana', 'cherry'].map((fruit, index) => (
<li key={index}>{fruit}</li>
))}
</ul>
</div>
);
};
export default MyComponent;
在这个例子中:
<h1>
、<p>
、<ul>
和 <li>
等标签直接在 JavaScript 函数中使用,用于构建组件的 UI 结构。{name}
在 <h1>
中动态地插入变量 name
的值。{}
花括号包裹的 JavaScript 表达式,例如 ['apple', 'banana', 'cherry'].map()
来生成列表项 <li>
。key={index}
用于在 React 中标识列表项的唯一性,帮助 React 更高效地管理组件的更新。总结来说,.jsx
是 React 中用于定义组件 UI 结构的一种语法扩展,它结合了 JavaScript 的表达能力和 HTML 标记的直观性,是开发现代 Web 应用的重要工具之一。
import React from 'react';
const MyComponent = () => {
// 假设我们有一个水果列表
const fruits = ['apple', 'banana', 'cherry'];
return (
<div>
<h2>Fruit List:</h2>
<ul>
{/* 使用 map 方法遍历数组,并为每个元素生成一个 <li> 元素 */}
{fruits.map((fruit, index) => (
<li key={index}>{fruit}</li>
))}
</ul>
</div>
);
};
export default MyComponent;
这是最常用的方式,通过三元运算符来实现简单的条件渲染。
import React from 'react';
const MyComponent = () => {
const isLoggedIn = true;
return (
<div>
{isLoggedIn ? <p>Welcome back!</p> : <p>Please sign in.</p>}
</div>
);
};
export default MyComponent;
适用于条件为真时才渲染内容的场景。
import React from 'react';
const MyComponent = () => {
const isLoggedIn = true;
return (
<div>
{isLoggedIn && <p>Welcome back!</p>}
</div>
);
};
export default MyComponent;
适用于需要执行更多逻辑或多条件判断的情况。
import React from 'react';
const MyComponent = () => {
const status = 'loggedOut'; // 可以是 'loggedIn' 或 'loggedOut'
return (
<div>
{(() => {
if (status === 'loggedIn') {
return <p>Welcome back!</p>;
} else if (status === 'loggedOut') {
return <p>Please sign in.</p>;
} else {
return <p>Status unknown.</p>;
}
})()}
</div>
);
};
export default MyComponent;
将条件渲染逻辑封装到单独的组件中,可以提高代码的可读性和复用性。
import React from 'react';
const Greeting = ({ isLoggedIn }) => {
if (isLoggedIn) {
return <p>Welcome back!</p>;
} else {
return <p>Please sign in.</p>;
}
};
const MyComponent = () => {
const isLoggedIn = true;
return (
<div>
<Greeting isLoggedIn={isLoggedIn} />
</div>
);
};
export default MyComponent;
在 React 中,可以直接在 JSX 中通过类似 HTML 的方式来绑定事件处理函数。例如,给按钮绑定点击事件:
import React from 'react';
const MyComponent = () => {
const handleClick = () => {
console.log('Button clicked!');
};
return (
<div>
<button onClick={handleClick}>Click me</button>
</div>
);
};
export default MyComponent;
在这个例子中,onClick
是 React 的事件属性,它接收一个函数作为值。当按钮被点击时,handleClick
函数会被调用。
React 的事件处理函数与普通的 JavaScript 事件处理函数类似,它们接收一个合成事件对象 (SyntheticEvent),而不是原生 DOM 事件对象。这使得跨浏览器的事件处理更加一致和可靠。
import React from 'react';
const MyComponent = () => {
const handleClick = (event) => {
console.log('Button clicked!', event.target);
};
return (
<div>
<button onClick={handleClick}>Click me</button>
</div>
);
};
export default MyComponent;
在上面的示例中,handleClick
函数的参数 event
是一个合成事件对象,可以通过 event.target
访问触发事件的 DOM 元素。
有时候需要给事件处理函数传递额外的参数。可以使用箭头函数或者 bind
方法来实现这一点。
使用箭头函数:
import React from 'react';
const MyComponent = () => {
const handleClick = (name) => {
console.log(`Hello, ${name} clicked!`);
};
return (
<div>
<button onClick={() => handleClick('World')}>Click me</button>
</div>
);
};
export default MyComponent;
使用 bind
方法:
import React from 'react';
const MyComponent = () => {
const handleClick = (name) => {
console.log(`Hello, ${name} clicked!`);
};
return (
<div>
<button onClick={handleClick.bind(null, 'World')}>Click me</button>
</div>
);
};
export default MyComponent;
这两种方式都可以将 'World'
作为参数传递给 handleClick
函数。
在 React 中,阻止事件的默认行为和冒泡可以通过合成事件对象的方法来实现。
阻止默认行为:
import React from 'react';
const MyComponent = () => {
const handleClick = (event) => {
event.preventDefault();
console.log('Button clicked!');
};
return (
<div>
<a href="#" onClick={handleClick}>Click me</a>
</div>
);
};
export default MyComponent;
阻止冒泡:
import React from 'react';
const MyComponent = () => {
const handleClick = (event) => {
event.stopPropagation();
console.log('Button clicked!');
};
return (
<div onClick={() => console.log('Div clicked!')}>
<button onClick={handleClick}>Click me</button>
</div>
);
};
export default MyComponent;
React 的事件绑定和处理与传统的 JavaScript 事件处理有些许差异,主要体现在事件对象的处理上,使用合成事件对象来实现跨浏览器一致性。通过上述方法,可以有效地在 React 中处理各种事件,并进行事件传参、阻止默认行为和冒泡等操作。
在 React 中,组件是构建用户界面的基本单位,可以将 UI 分割成独立的、可复用的代码片段。组件可以是函数组件或类组件,它们可以接收输入的数据(称为 props)并返回描述页面展示内容的 React 元素。组件可以包含其他组件、HTML 标签和逻辑,使得复杂的 UI 可以被有效地管理和开发。
componentDidMount
、componentDidUpdate
和 componentWillUnmount
等,用于在组件生命周期不同阶段执行特定的逻辑。以下是一个简单的 React 函数组件的示例,展示了一个名为 HelloWorld
的组件,它接收一个 name
属性作为输入,并渲染一个简单的问候语句:
import React from 'react';
// 函数组件:HelloWorld
const HelloWorld = ({ name }) => {
return (
<div>
<h1>Hello, {name}!</h1>
<p>Welcome to React components.</p>
</div>
);
};
export default HelloWorld;
在这个例子中,HelloWorld
组件接收一个 name
属性,用于动态显示问候语。这种组件可以被多次使用,每次使用时传入不同的 name
属性,使得界面呈现的问候语可以个性化定制。
总之,React 组件是构建现代 Web 应用的核心概念之一,它们通过组合和抽象,使得开发者可以更加高效和灵活地构建用户界面。
useState
是 React 中的一个 Hook,用于在函数组件中添加状态管理功能。它允许你在函数组件中声明状态变量,并提供一个方法来更新这些状态。
useState
是从 React 中导入的,并且通常在函数组件的顶部进行调用。它返回一个包含两个元素的数组:当前状态值和一个更新状态的函数。
import React, { useState } from 'react';
const Counter = () => {
// 声明一个名为 "count" 的状态变量,初始值为 0
const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
};
export default Counter;
在这个示例中:
const [count, setCount] = useState(0);
声明了一个名为 count
的状态变量,初始值为 0
。useState
返回一个数组,第一个元素是当前状态值(count
),第二个元素是更新状态的函数(setCount
)。setCount(count + 1)
更新 count
的值,从而触发组件的重新渲染,并更新显示的点击次数。你可以在一个组件中使用多个 useState
调用来管理不同的状态变量:
import React, { useState } from 'react';
const MultiStateComponent = () => {
const [count, setCount] = useState(0);
const [text, setText] = useState('');
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
<input
type="text"
value={text}
onChange={(e) => setText(e.target.value)}
placeholder="Type something..."
/>
<p>You typed: {text}</p>
</div>
);
};
export default MultiStateComponent;
在这个示例中,我们使用了两个 useState
调用来分别管理 count
和 text
两个状态变量。
你可以将状态的初始值设置为函数返回的值,这在初始化需要执行复杂计算时特别有用:
import React, { useState } from 'react';
const ExpensiveComponent = () => {
const initialCount = () => {
// 模拟一个复杂的计算
return 42;
};
const [count, setCount] = useState(initialCount);
return (
<div>
<p>Initial count: {count}</p>
<button onClick={() => setCount(count + 1)}>
Increment
</button>
</div>
);
};
export default ExpensiveComponent;
在这个示例中,initialCount
函数只会在组件初次渲染时执行一次,用于计算初始状态值。
useState
是一个 React Hook,用于在函数组件中添加状态管理功能。useState
返回一个包含当前状态值和一个更新状态的函数的数组。useState
调用来管理多个状态变量。在 React 中,使用 useState
来管理和修改状态时,有一些规则和最佳实践需要遵循,以确保状态的管理和更新过程是高效和可靠的。以下是修改状态的主要规则和一些示例:
React 的状态更新是异步的,这意味着调用状态更新函数后,状态的更新不会立即反映出来,而是在下一次重新渲染时才会生效。
import React, { useState } from 'react';
const Counter = () => {
const [count, setCount] = useState(0);
const handleClick = () => {
setCount(count + 1);
console.log(count); // 这里的 count 可能不会立即更新
};
return (
<div>
<p>{count}</p>
<button onClick={handleClick}>Increment</button>
</div>
);
};
export default Counter;
在上述例子中,console.log(count)
可能不会立即显示更新后的值,因为状态更新是异步的。
为了确保状态更新时使用的值是最新的,可以传递一个函数给状态更新函数。这个函数会接收当前的状态值作为参数。
import React, { useState } from 'react';
const Counter = () => {
const [count, setCount] = useState(0);
const handleClick = () => {
setCount(prevCount => prevCount + 1);
};
return (
<div>
<p>{count}</p>
<button onClick={handleClick}>Increment</button>
</div>
);
};
export default Counter;
在这个示例中,setCount
接收一个函数 prevCount => prevCount + 1
,确保使用的是最新的状态值进行更新。
状态应该是不可变的,不要直接修改状态对象,而是通过创建新对象来更新状态。
import React, { useState } from 'react';
const Example = () => {
const [user, setUser] = useState({ name: 'John', age: 30 });
const updateAge = () => {
setUser(prevUser => ({
...prevUser,
age: prevUser.age + 1
}));
};
return (
<div>
<p>{user.name}</p>
<p>{user.age}</p>
<button onClick={updateAge}>Increment Age</button>
</div>
);
};
export default Example;
在这个示例中,使用扩展运算符 ...prevUser
创建了一个新的用户对象,并更新了年龄属性。
对于对象类型的状态,需要手动合并更新的部分,因为 useState
不会自动合并更新对象。
import React, { useState } from 'react';
const Example = () => {
const [user, setUser] = useState({ name: 'John', age: 30 });
const updateName = () => {
setUser(prevUser => ({
...prevUser,
name: 'Doe'
}));
};
return (
<div>
<p>{user.name}</p>
<p>{user.age}</p>
<button onClick={updateName}>Update Name</button>
</div>
);
};
export default Example;
在这个示例中,setUser
的更新函数创建了一个新的用户对象,同时保持其他属性不变。
尽量避免在每次渲染中都调用状态更新函数,只有在需要时才更新状态,以提高性能。
import React, { useState } from 'react';
const Example = () => {
const [count, setCount] = useState(0);
const handleClick = () => {
if (count < 10) {
setCount(count + 1);
}
};
return (
<div>
<p>{count}</p>
<button onClick={handleClick}>Increment</button>
</div>
);
};
export default Example;
在这个示例中,只有在 count
小于 10 时才会更新状态,避免了不必要的状态更新。
React 是一个用于构建用户界面的开源 JavaScript 库,由 Facebook 开发和维护。自 2013 年开源以来,React 已成为前端开发的热门选择,广泛应用于单页应用(SPA)和复杂的多页应用的开发。React 的主要目标是简化 UI 开发,使其更加高效、灵活和可维护。
总结来说,React 相对于传统的 DOM 操作,通过虚拟 DOM、组件化、声明式编程等特性,提供了更高效、可维护和可扩展的开发方式。这些优势使得 React 成为前端开发中的主流框架之一,被广泛应用于各种规模和类型的项目中。
总体来说,React 和 Vue.js 都是优秀的前端开发框架,选择适合的框架取决于项目需求、团队技术栈和开发者的偏好。React 在大型和复杂的应用中可能更适合,特别是需要高度灵活性和可定制性的场景;而 Vue.js 则更适合于快速开发和中小型应用,提供了更多集成和便捷的解决方案。
shouldComponentUpdate
:类组件中可以使用 shouldComponentUpdate
方法来控制组件是否需要重新渲染,从而避免不必要的重绘和回流。React.memo
进行性能优化,它会对比前后属性,只有属性变化时才会重新渲染组件。useMemo
和 useCallback
:Hooks 提供的 useMemo
和 useCallback
可以缓存计算结果和函数引用,避免子组件不必要的更新。以下示例演示了 React 如何通过 React.memo
和 useMemo
来减少不必要的渲染:
import React, { useState, useMemo } from 'react';
// 一个简单的子组件,仅在 props 变化时重新渲染
const ChildComponent = React.memo(({ value }) => {
console.log('ChildComponent render');
return <div>{value}</div>;
});
function App() {
const [count, setCount] = useState(0);
const [text, setText] = useState('');
// 使用 useMemo 缓存计算结果,避免不必要的计算
const memoizedValue = useMemo(() => {
console.log('Calculating memoized value');
return count * 2;
}, [count]);
return (
<div>
<h1>Count: {count}</h1>
<button onClick={() => setCount(count + 1)}>Increment</button>
<input
type="text"
value={text}
onChange={(e) => setText(e.target.value)}
/>
<ChildComponent value={memoizedValue} />
</div>
);
}
export default App;
在这个示例中:
ChildComponent
只有在 value
变化时才会重新渲染,因为它被 React.memo
包裹。memoizedValue
使用 useMemo
进行缓存,只有在 count
变化时才会重新计算,避免了不必要的计算和渲染。通过虚拟 DOM、批量更新、避免不必要的更新和合并更新,React 有效地减少了重绘和回流的次数,从而提升了应用的性能。与传统的直接操作 DOM 的方式相比,React 提供了一种更加高效和优化的 UI 更新机制。
.jsx
是 JavaScript XML 的缩写,它是一种 JavaScript 的语法扩展,允许开发者在 JavaScript 中直接编写类似 HTML 的标记语言,用于定义 React 组件的 UI 结构。以下是一些 .jsx
语法的核心特点和使用方法:
.jsx
允许在 JavaScript 中嵌入类似 HTML 的标记语言,用于声明 UI 的结构和组件的外观。<div>
、<span>
、<h1>
等 HTML 标签,以及自定义的 React 组件。.jsx
中,可以使用 {}
花括号来包裹 JavaScript 表达式,用于在标记中动态地插入变量、计算结果或函数调用。.jsx
具有了 JavaScript 的全部表达能力,可以进行条件判断、循环、计算等操作。.jsx
允许在标签上使用属性,并支持使用表达式作为属性值。<Component name={variable} />
,其中 name
是一个属性,variable
是一个 JavaScript 变量或表达式。.jsx
中的标签可以是自闭合的,比如 <img>
、<input>
,也可以使用 /
符号来表示自闭合,例如 <br />
。//
单行注释和 /* */
多行注释在 .jsx
文件中添加注释(注释要写在{}内)。以下是一个简单的 React 组件示例,展示了 .jsx
的基本语法和特点:
import React from 'react';
// 定义一个 React 函数组件
const MyComponent = () => {
const name = 'World';
return (
<div>
<h1>Hello, {name}!</h1>
<p>Welcome to JSX!</p>
<ul>
{['apple', 'banana', 'cherry'].map((fruit, index) => (
<li key={index}>{fruit}</li>
))}
</ul>
</div>
);
};
export default MyComponent;
在这个例子中:
<h1>
、<p>
、<ul>
和 <li>
等标签直接在 JavaScript 函数中使用,用于构建组件的 UI 结构。{name}
在 <h1>
中动态地插入变量 name
的值。{}
花括号包裹的 JavaScript 表达式,例如 ['apple', 'banana', 'cherry'].map()
来生成列表项 <li>
。key={index}
用于在 React 中标识列表项的唯一性,帮助 React 更高效地管理组件的更新。总结来说,.jsx
是 React 中用于定义组件 UI 结构的一种语法扩展,它结合了 JavaScript 的表达能力和 HTML 标记的直观性,是开发现代 Web 应用的重要工具之一。
import React from 'react';
const MyComponent = () => {
// 假设我们有一个水果列表
const fruits = ['apple', 'banana', 'cherry'];
return (
<div>
<h2>Fruit List:</h2>
<ul>
{/* 使用 map 方法遍历数组,并为每个元素生成一个 <li> 元素 */}
{fruits.map((fruit, index) => (
<li key={index}>{fruit}</li>
))}
</ul>
</div>
);
};
export default MyComponent;
这是最常用的方式,通过三元运算符来实现简单的条件渲染。
import React from 'react';
const MyComponent = () => {
const isLoggedIn = true;
return (
<div>
{isLoggedIn ? <p>Welcome back!</p> : <p>Please sign in.</p>}
</div>
);
};
export default MyComponent;
适用于条件为真时才渲染内容的场景。
import React from 'react';
const MyComponent = () => {
const isLoggedIn = true;
return (
<div>
{isLoggedIn && <p>Welcome back!</p>}
</div>
);
};
export default MyComponent;
适用于需要执行更多逻辑或多条件判断的情况。
import React from 'react';
const MyComponent = () => {
const status = 'loggedOut'; // 可以是 'loggedIn' 或 'loggedOut'
return (
<div>
{(() => {
if (status === 'loggedIn') {
return <p>Welcome back!</p>;
} else if (status === 'loggedOut') {
return <p>Please sign in.</p>;
} else {
return <p>Status unknown.</p>;
}
})()}
</div>
);
};
export default MyComponent;
将条件渲染逻辑封装到单独的组件中,可以提高代码的可读性和复用性。
import React from 'react';
const Greeting = ({ isLoggedIn }) => {
if (isLoggedIn) {
return <p>Welcome back!</p>;
} else {
return <p>Please sign in.</p>;
}
};
const MyComponent = () => {
const isLoggedIn = true;
return (
<div>
<Greeting isLoggedIn={isLoggedIn} />
</div>
);
};
export default MyComponent;
在 React 中,可以直接在 JSX 中通过类似 HTML 的方式来绑定事件处理函数。例如,给按钮绑定点击事件:
import React from 'react';
const MyComponent = () => {
const handleClick = () => {
console.log('Button clicked!');
};
return (
<div>
<button onClick={handleClick}>Click me</button>
</div>
);
};
export default MyComponent;
在这个例子中,onClick
是 React 的事件属性,它接收一个函数作为值。当按钮被点击时,handleClick
函数会被调用。
React 的事件处理函数与普通的 JavaScript 事件处理函数类似,它们接收一个合成事件对象 (SyntheticEvent),而不是原生 DOM 事件对象。这使得跨浏览器的事件处理更加一致和可靠。
import React from 'react';
const MyComponent = () => {
const handleClick = (event) => {
console.log('Button clicked!', event.target);
};
return (
<div>
<button onClick={handleClick}>Click me</button>
</div>
);
};
export default MyComponent;
在上面的示例中,handleClick
函数的参数 event
是一个合成事件对象,可以通过 event.target
访问触发事件的 DOM 元素。
有时候需要给事件处理函数传递额外的参数。可以使用箭头函数或者 bind
方法来实现这一点。
使用箭头函数:
import React from 'react';
const MyComponent = () => {
const handleClick = (name) => {
console.log(`Hello, ${name} clicked!`);
};
return (
<div>
<button onClick={() => handleClick('World')}>Click me</button>
</div>
);
};
export default MyComponent;
使用 bind
方法:
import React from 'react';
const MyComponent = () => {
const handleClick = (name) => {
console.log(`Hello, ${name} clicked!`);
};
return (
<div>
<button onClick={handleClick.bind(null, 'World')}>Click me</button>
</div>
);
};
export default MyComponent;
这两种方式都可以将 'World'
作为参数传递给 handleClick
函数。
在 React 中,阻止事件的默认行为和冒泡可以通过合成事件对象的方法来实现。
阻止默认行为:
import React from 'react';
const MyComponent = () => {
const handleClick = (event) => {
event.preventDefault();
console.log('Button clicked!');
};
return (
<div>
<a href="#" onClick={handleClick}>Click me</a>
</div>
);
};
export default MyComponent;
阻止冒泡:
import React from 'react';
const MyComponent = () => {
const handleClick = (event) => {
event.stopPropagation();
console.log('Button clicked!');
};
return (
<div onClick={() => console.log('Div clicked!')}>
<button onClick={handleClick}>Click me</button>
</div>
);
};
export default MyComponent;
React 的事件绑定和处理与传统的 JavaScript 事件处理有些许差异,主要体现在事件对象的处理上,使用合成事件对象来实现跨浏览器一致性。通过上述方法,可以有效地在 React 中处理各种事件,并进行事件传参、阻止默认行为和冒泡等操作。
在 React 中,组件是构建用户界面的基本单位,可以将 UI 分割成独立的、可复用的代码片段。组件可以是函数组件或类组件,它们可以接收输入的数据(称为 props)并返回描述页面展示内容的 React 元素。组件可以包含其他组件、HTML 标签和逻辑,使得复杂的 UI 可以被有效地管理和开发。
componentDidMount
、componentDidUpdate
和 componentWillUnmount
等,用于在组件生命周期不同阶段执行特定的逻辑。以下是一个简单的 React 函数组件的示例,展示了一个名为 HelloWorld
的组件,它接收一个 name
属性作为输入,并渲染一个简单的问候语句:
import React from 'react';
// 函数组件:HelloWorld
const HelloWorld = ({ name }) => {
return (
<div>
<h1>Hello, {name}!</h1>
<p>Welcome to React components.</p>
</div>
);
};
export default HelloWorld;
在这个例子中,HelloWorld
组件接收一个 name
属性,用于动态显示问候语。这种组件可以被多次使用,每次使用时传入不同的 name
属性,使得界面呈现的问候语可以个性化定制。
总之,React 组件是构建现代 Web 应用的核心概念之一,它们通过组合和抽象,使得开发者可以更加高效和灵活地构建用户界面。
useState
是 React 中的一个 Hook,用于在函数组件中添加状态管理功能。它允许你在函数组件中声明状态变量,并提供一个方法来更新这些状态。
useState
是从 React 中导入的,并且通常在函数组件的顶部进行调用。它返回一个包含两个元素的数组:当前状态值和一个更新状态的函数。
import React, { useState } from 'react';
const Counter = () => {
// 声明一个名为 "count" 的状态变量,初始值为 0
const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
};
export default Counter;
在这个示例中:
const [count, setCount] = useState(0);
声明了一个名为 count
的状态变量,初始值为 0
。useState
返回一个数组,第一个元素是当前状态值(count
),第二个元素是更新状态的函数(setCount
)。setCount(count + 1)
更新 count
的值,从而触发组件的重新渲染,并更新显示的点击次数。你可以在一个组件中使用多个 useState
调用来管理不同的状态变量:
import React, { useState } from 'react';
const MultiStateComponent = () => {
const [count, setCount] = useState(0);
const [text, setText] = useState('');
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
<input
type="text"
value={text}
onChange={(e) => setText(e.target.value)}
placeholder="Type something..."
/>
<p>You typed: {text}</p>
</div>
);
};
export default MultiStateComponent;
在这个示例中,我们使用了两个 useState
调用来分别管理 count
和 text
两个状态变量。
你可以将状态的初始值设置为函数返回的值,这在初始化需要执行复杂计算时特别有用:
import React, { useState } from 'react';
const ExpensiveComponent = () => {
const initialCount = () => {
// 模拟一个复杂的计算
return 42;
};
const [count, setCount] = useState(initialCount);
return (
<div>
<p>Initial count: {count}</p>
<button onClick={() => setCount(count + 1)}>
Increment
</button>
</div>
);
};
export default ExpensiveComponent;
在这个示例中,initialCount
函数只会在组件初次渲染时执行一次,用于计算初始状态值。
useState
是一个 React Hook,用于在函数组件中添加状态管理功能。useState
返回一个包含当前状态值和一个更新状态的函数的数组。useState
调用来管理多个状态变量。在 React 中,使用 useState
来管理和修改状态时,有一些规则和最佳实践需要遵循,以确保状态的管理和更新过程是高效和可靠的。以下是修改状态的主要规则和一些示例:
React 的状态更新是异步的,这意味着调用状态更新函数后,状态的更新不会立即反映出来,而是在下一次重新渲染时才会生效。
import React, { useState } from 'react';
const Counter = () => {
const [count, setCount] = useState(0);
const handleClick = () => {
setCount(count + 1);
console.log(count); // 这里的 count 可能不会立即更新
};
return (
<div>
<p>{count}</p>
<button onClick={handleClick}>Increment</button>
</div>
);
};
export default Counter;
在上述例子中,console.log(count)
可能不会立即显示更新后的值,因为状态更新是异步的。
为了确保状态更新时使用的值是最新的,可以传递一个函数给状态更新函数。这个函数会接收当前的状态值作为参数。
import React, { useState } from 'react';
const Counter = () => {
const [count, setCount] = useState(0);
const handleClick = () => {
setCount(prevCount => prevCount + 1);
};
return (
<div>
<p>{count}</p>
<button onClick={handleClick}>Increment</button>
</div>
);
};
export default Counter;
在这个示例中,setCount
接收一个函数 prevCount => prevCount + 1
,确保使用的是最新的状态值进行更新。
状态应该是不可变的,不要直接修改状态对象,而是通过创建新对象来更新状态。
import React, { useState } from 'react';
const Example = () => {
const [user, setUser] = useState({ name: 'John', age: 30 });
const updateAge = () => {
setUser(prevUser => ({
...prevUser,
age: prevUser.age + 1
}));
};
return (
<div>
<p>{user.name}</p>
<p>{user.age}</p>
<button onClick={updateAge}>Increment Age</button>
</div>
);
};
export default Example;
在这个示例中,使用扩展运算符 ...prevUser
创建了一个新的用户对象,并更新了年龄属性。
对于对象类型的状态,需要手动合并更新的部分,因为 useState
不会自动合并更新对象。
import React, { useState } from 'react';
const Example = () => {
const [user, setUser] = useState({ name: 'John', age: 30 });
const updateName = () => {
setUser(prevUser => ({
...prevUser,
name: 'Doe'
}));
};
return (
<div>
<p>{user.name}</p>
<p>{user.age}</p>
<button onClick={updateName}>Update Name</button>
</div>
);
};
export default Example;
在这个示例中,setUser
的更新函数创建了一个新的用户对象,同时保持其他属性不变。
尽量避免在每次渲染中都调用状态更新函数,只有在需要时才更新状态,以提高性能。
import React, { useState } from 'react';
const Example = () => {
const [count, setCount] = useState(0);
const handleClick = () => {
if (count < 10) {
setCount(count + 1);
}
};
return (
<div>
<p>{count}</p>
<button onClick={handleClick}>Increment</button>
</div>
);
};
export default Example;
在这个示例中,只有在 count
小于 10 时才会更新状态,避免了不必要的状态更新。
Dans cet exemple, nous utilisons deux useState
Appeler pour gérer séparémentcount
ettext
Deux variables d'état.
Vous pouvez définir la valeur initiale de l'état sur la valeur renvoyée par la fonction, ce qui est particulièrement utile lorsque l'initialisation nécessite d'effectuer des calculs complexes :
import React, { useState } from 'react';
const ExpensiveComponent = () => {
const initialCount = () => {
// 模拟一个复杂的计算
return 42;
};
const [count, setCount] = useState(initialCount);
return (
<div>
<p>Initial count: {count}</p>
<button onClick={() => setCount(count + 1)}>
Increment
</button>
</div>
);
};
export default ExpensiveComponent;
Dans cet exemple,initialCount
La fonction ne sera exécutée qu'une seule fois lors du premier rendu du composant pour calculer la valeur de l'état initial.
useState
Est un React Hook utilisé pour ajouter une fonctionnalité de gestion d'état aux composants de fonction.useState
Renvoie un tableau contenant la valeur de l'état actuel et une fonction qui met à jour l'état.useState
Appelé pour gérer plusieurs variables d'état.Dans React, utilisez useState
Lors de la gestion et de la modification de l'état, certaines règles et bonnes pratiques doivent être suivies pour garantir que le processus de gestion et de mise à jour de l'état est efficace et fiable. Voici les principales règles de modification de statut et quelques exemples :
Les mises à jour d'état de React sont asynchrones, ce qui signifie qu'après avoir appelé la fonction de mise à jour d'état, les mises à jour d'état ne seront pas reflétées immédiatement, mais ne prendront effet qu'après le prochain rendu.
import React, { useState } from 'react';
const Counter = () => {
const [count, setCount] = useState(0);
const handleClick = () => {
setCount(count + 1);
console.log(count); // 这里的 count 可能不会立即更新
};
return (
<div>
<p>{count}</p>
<button onClick={handleClick}>Increment</button>
</div>
);
};
export default Counter;
Dans l'exemple ci-dessus,console.log(count)
La valeur mise à jour peut ne pas être affichée immédiatement car les mises à jour d'état sont asynchrones.
Pour vous assurer que les valeurs utilisées lors de la mise à jour du statut sont les plus récentes, vous pouvez transmettre une fonction à la fonction de mise à jour du statut. Cette fonction reçoit la valeur d'état actuelle en tant que paramètre.
import React, { useState } from 'react';
const Counter = () => {
const [count, setCount] = useState(0);
const handleClick = () => {
setCount(prevCount => prevCount + 1);
};
return (
<div>
<p>{count}</p>
<button onClick={handleClick}>Increment</button>
</div>
);
};
export default Counter;
Dans cet exemple,setCount
recevoir une fonctionprevCount => prevCount + 1
, garantissant que la dernière valeur d'état est utilisée pour la mise à jour.
L'état doit être immuable, ne modifiez pas directement l'objet d'état, mais mettez à jour l'état en créant de nouveaux objets.
import React, { useState } from 'react';
const Example = () => {
const [user, setUser] = useState({ name: 'John', age: 30 });
const updateAge = () => {
setUser(prevUser => ({
...prevUser,
age: prevUser.age + 1
}));
};
return (
<div>
<p>{user.name}</p>
<p>{user.age}</p>
<button onClick={updateAge}>Increment Age</button>
</div>
);
};
export default Example;
Dans cet exemple, utilisez l'opérateur spread ...prevUser
Un nouvel objet utilisateur est créé et l'attribut age est mis à jour.
Pour les états de type d'objet, les parties mises à jour doivent être fusionnées manuellement car useState
Les objets mis à jour ne sont pas fusionnés automatiquement.
import React, { useState } from 'react';
const Example = () => {
const [user, setUser] = useState({ name: 'John', age: 30 });
const updateName = () => {
setUser(prevUser => ({
...prevUser,
name: 'Doe'
}));
};
return (
<div>
<p>{user.name}</p>
<p>{user.age}</p>
<button onClick={updateName}>Update Name</button>
</div>
);
};
export default Example;
Dans cet exemple,setUser
La fonction de mise à jour crée un nouvel objet utilisateur tout en laissant les autres propriétés inchangées.
Essayez d'éviter d'appeler la fonction de mise à jour d'état à chaque rendu et ne mettez à jour l'état que lorsque cela est nécessaire pour améliorer les performances.
import React, { useState } from 'react';
const Example = () => {
const [count, setCount] = useState(0);
const handleClick = () => {
if (count < 10) {
setCount(count + 1);
}
};
return (
<div>
<p>{count}</p>
<button onClick={handleClick}>Increment</button>
</div>
);
};
export default Example;
Dans cet exemple, seulement si count
Le statut sera mis à jour uniquement lorsque la valeur est inférieure à 10, évitant ainsi les mises à jour inutiles du statut.