React基础 第九章(组件的纯粹性:构建可预测的界面)

在React中,保持组件的纯粹性是至关重要的。纯粹的组件类似于纯函数,在相同的输入下总是产生相同的输出,而不会产生副作用。本文将探讨如何保持组件的纯粹性,提供开发中的技巧、示例代码以及注意事项。

纯函数与组件

纯函数是函数式编程中的一个概念,它指的是给定相同的输入,总是返回相同的输出,并且不会改变任何外部状态。React组件应当遵循纯函数的原则。

技巧:

  • 将组件视为一个函数,它的props是输入,渲染的JSX是输出。
  • 避免在组件内部改变任何外部状态或变量。

示例:

jsx 复制代码
function Recipe({ drinkers }) {
  return (
    <ol>
      <li>Boil {drinkers} cups of water.</li>
      <li>Add {drinkers} spoons of tea and {0.5 * drinkers} spoons of spice.</li>
      <li>Add {0.5 * drinkers} cups of milk to boil and sugar to taste.</li>
    </ol>
  );
}

注意事项:

  • 组件不应依赖于外部变量,如全局状态或直接操作DOM。
  • 组件的输出应仅依赖于其props和state。

正确代码:

jsx 复制代码
function Cup({ guest }) {
  return <h2>Tea cup for guest #{guest}</h2>;
}

错误代码:

jsx 复制代码
let guest = 0; // 错误:依赖外部变量
function Cup() {
  guest = guest + 1;
  return <h2>Tea cup for guest #{guest}</h2>;
}

严格模式与组件检测

React的严格模式(StrictMode)可以帮助开发者发现不纯的组件。

技巧:

  • 使用<React.StrictMode>包裹应用或组件,以启用严格模式。
  • 利用严格模式在开发过程中发现和修复问题。

示例:

jsx 复制代码
import React from 'react';

function App() {
  return (
    <React.StrictMode>
      <MyComponent />
    </React.StrictMode>
  );
}

注意事项:

  • 严格模式可能会导致组件渲染两次,但这仅发生在开发模式下。
  • 确保组件在严格模式下的行为与预期一致。

正确代码:

jsx 复制代码
// 组件在严格模式下表现正常
function MyComponent() {
  // ...
}

错误代码:

jsx 复制代码
// 组件在严格模式下表现异常,因为它依赖外部变量
let counter = 0;
function MyComponent() {
  counter++; // 错误:在组件内部改变外部变量
  // ...
}

局部变更与副作用管理

在组件内部对局部变量进行变更是允许的,但应避免副作用。

技巧:

  • 在函数体内部创建新的局部变量和对象,可以自由地更改它们。
  • 使用useEffect来处理副作用,如API调用、订阅等。

示例:

jsx 复制代码
function TeaGathering() {
  let cups = [];
  for (let i = 1; i <= 12; i++) {
    cups.push(<Cup key={i} guest={i} />);
  }
  return cups;
}

注意事项:

  • 避免在组件外部声明变量,然后在组件内部更改它们。
  • 保持副作用与渲染逻辑分离。

正确代码:

jsx 复制代码
// 局部变量在组件内部创建和修改,不影响外部状态
function TeaGathering() {
  let cups = [];
  // ...
}

错误代码:

jsx 复制代码
let cups = []; // 错误:在组件外部声明变量
function TeaGathering() {
  cups.push(<Cup key={1} guest={1} />); // 错误:改变外部变量
  // ...
}

通过遵循上述技巧和注意事项,你可以确保你的React组件保持纯粹,从而构建出可预测且稳定的用户界面。纯粹的组件不仅易于测试和维护,而且还能提高React应用的性能。

相关推荐
子兮曰5 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰5 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万5 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝5 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋5 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁5 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
汉堡大王95275 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大5 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师5 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端
沙蒿同学5 天前
我用 Go 搭了一条 AI Agent 流水线:从 1 张商品图到一整套淘宝详情页
前端·javascript·后端