日常工作中需要避免的9个React坏习惯

react · 浏览次数 : 16

小编点评

前言 React 是前端开发领域中最受欢迎的 JavaScript 库之一,但有时候在编写 React 应用程序时,可能陷入一些不佳的习惯和错误做法。这些不佳的习惯可能导致性能下降、代码难以维护,以及其他问题。在本文中,我们将探讨日常工作中应该避免的 9 个坏 React 习惯,并提供相关示例代码来说明这些问题以及如何避免它们。 1. 属性传递问题(Prop Drilling) 属性传递问题是一种常见的不良习惯,它发生在将属性从一个组件传递到多层嵌套的子组件时。这可能导致性能问题和代码可读性降低。理想情况下,应该尽量避免将属性传递超过 2 层。 2. 导入过多所需的内容 在 React 应用程序中,导入过多的依赖项可能会导致包变得庞大,从而增加加载时间。在日常工作中,确保只导入需要的依赖项。 3. 不将业务逻辑与组件逻辑分离 在 React 中,尽量将业务逻辑与 UI 组件逻辑分开,以提高代码的可读性和可维护性。将业务逻辑提取到独立的服务文件或模块中,以使组件保持简单。 4. 在每次渲染时重复执行工作 React 组件可能会在不同时间点重新渲染,如果不小心,某些工作可能会在每次渲染时都重复执行,这会降低性能。为了避免这种情况,可以使用 useMemo 和 useCallback 来记忆化操作,以便它们不会在每次渲染时重新计算。 5. 不正确使用 useEffect 钩子 useEffect 钩子用于处理副作用,但如果不正确使用它,可能会导致创建多个事件监听器,这会引发问题。正确使用 useEffect 的方法包括将清理函数返回以取消订阅,以及使用空的依赖数组以确保只运行一次。 6. 不正确使用布尔运算符 在 React 组件中,经常需要根据条件来渲染不同的内容。然而,不正确使用布尔运算符可能会导致意外的问题。为了避免这种情况,最好将条件转化为布尔值。 7. 到处使用三元表达式进行条件渲染 三元表达式是一种强大的条件渲染工具,但滥用它可能会导致代码难以阅读。考虑以下示例: 8. 不定义属性类型或不解构属性 为组件的属性定义类型和解构属性是一种良好的实践,它有助于提高代码的可维护性和稳定性。在日常工作中,我们应该使用 PropTypes 或 TypeScript 等工具来为属性添加类型定义,并解构属性以使其更清晰。 9. 较大的应用程序没进行代码拆分 对于大型 React 应用程序,应该考虑使用代码拆分(Code Splitting)以提高初始加载性能。代码拆分允许将代码分割为较小的块,这些块可以在需要时加载,从而减小初始包的大小。 归纳总结 以上内容,生成内容时需要带简单的排版

正文

前言

React是前端开发领域中最受欢迎的JavaScript库之一,但有时候在编写React应用程序时,可能陷入一些不佳的习惯和错误做法。这些不佳的习惯可能导致性能下降、代码难以维护,以及其他问题。在本文中,我们将探讨日常工作中应该避免的9个坏React习惯,并提供相关示例代码来说明这些问题以及如何避免它们。

1. 属性传递问题(Prop Drilling)

属性传递问题是一种常见的不良习惯,它发生在将属性从一个组件传递到多层嵌套的子组件时。这可能导致性能问题和代码可读性降低。理想情况下,应该尽量避免将属性传递超过2层。下面是一个示例:

// 父组件
function ParentComponent() {
  const data = 'Some data';

  return (
	<ChildComponent data={data} />
  );
}

// 子组件
function ChildComponent({ data }) {
  return (
	<GrandchildComponent data={data} />
  );
}

// 孙子组件
function GrandchildComponent({ data }) {
  // 使用数据
  return <div>{data}</div>;
}

在上面的示例中,data属性通过多个嵌套层级传递,这可能导致性能问题和可读性问题。解决这个问题的方法之一是使用React的上下文(context)来共享数据,或者重新组织组件结构。

2. 导入过多所需的内容

React应用程序中,导入过多的依赖项可能会导致包变得庞大,从而增加加载时间。在日常工作中,确保只导入需要的依赖项。例如,避免导入整个库,而只导入所需的功能。

// 不良示例 - 导入整个库
import _ from 'lodash';

// 良好示例 - 只导入所需的功能
import { someFunction } from 'lodash';

这有助于减小包的大小,提高应用程序性能。

3. 不将业务逻辑与组件逻辑分离

React中,尽量将业务逻辑与UI组件逻辑分开,以提高代码的可读性和可维护性。将业务逻辑提取到独立的服务文件或模块中,以使组件保持简单。以下是一个示例:

// 不良示例 - 业务逻辑混杂在组件中
function UserProfile() {
  const user = getUserData(); // 从API获取用户数据

  return (
	<div>
	  <h1>{user.name}</h1>
	  <p>{user.email}</p>
	</div>
  );
}

// 良好示例 - 业务逻辑分离
function UserProfile() {
  const user = useUserData(); // 从独立服务获取用户数据

  return (
	<div>
	  <h1>{user.name}</h1>
	  <p>{user.email}</p>
	</div>
  );
}

通过将业务逻辑提取到独立的useUserData函数中,使组件更加清晰和可维护。

4. 在每次渲染时重复执行工作

React组件可能会在不同时间点重新渲染,如果不小心,某些工作可能会在每次渲染时都重复执行,这会降低性能。为了避免这种情况,可以使用useMemouseCallback来记忆化操作,以便它们不会在每次渲染时重新计算。以下是一个示例:

function List({ items }) {
  // 不使用useMemo - 每次渲染都会重新过滤
  const filteredItems = items.filter(item => item.active);

  // 使用useMemo - 只在items发生变化时重新过滤
  const filteredItems = useMemo(() => items.filter(item => item.active), [items]);
}

通过使用useMemo,可以避免在每次渲染时重新计算filteredItems,从而提高性能。

5. 不正确使用useEffect钩子

useEffect钩子用于处理副作用,但如果不正确使用它,可能会导致创建多个事件监听器,这会引发问题。正确使用useEffect的方法包括将清理函数返回以取消订阅,以及使用空的依赖数组以确保只运行一次。以下是一个示例:

// 不良示例 - 每次渲染都会创建新的事件监听器
useEffect(() => {
  window.addEventListener('resize', handleResize);
  return () => {
	window.removeEventListener('resize', handleResize);
  };
});

// 良好示例 - 只在组件挂载时创建事件监听器
useEffect(() => {
  window.addEventListener('resize', handleResize);
	return () => {
	  window.removeEventListener('resize', handleResize);
	};
  }, []); // 空的依赖数组

通过使用空的依赖数组,确保了事件监听器只在组件挂载时创建一次。

6. 不正确使用布尔运算符

React组件中,经常需要根据条件来渲染不同的内容。然而,不正确使用布尔运算符可能会导致意外的问题。例如:

// 不良示例 - 使用 && 运算符
function ShoppingCart({ items }) {
  return (
	<div>
	  {items.length && <p>Items in cart: {items.length}</p>}
	</div>
  );
}

在上述示例中,当items.length0时,<p>元素将不会渲染,这可能不是我们期望的结果。为了避免这种情况,最好将条件转化为布尔值,如下所示:

// 良好示例 - 使用Boolean()将条件转换为布尔值
function ShoppingCart({ items }) {
  return (
	<div>
	  {Boolean(items.length) && <p>Items in cart: {items.length}</p>}
	</div>
  );
}

通过将条件转换为布尔值,我们可以确保<p>元素按预期渲染。

7. 到处使用三元表达式进行条件渲染

三元表达式是一种强大的条件渲染工具,但滥用它可能会导致代码难以阅读。特别是当多个三元表达式嵌套在一起时,代码会变得混乱。考虑以下示例:

// 不良示例 - 多个嵌套的三元表达式
function UserProfile({ user, isAdmin, isOwner }) {
  return (
	<div>
	  {isAdmin ? (
		<p>Admin</p>
	  ) : isOwner ? (
		<p>Owner</p>
	  ) : (
		<p>User</p>
	  )}
	</div>
  );
}

在上述示例中,多个三元表达式嵌套在一起,使代码难以理解。为了提高可读性,可以考虑使用函数或组件来代替三元表达式。以下是一个改进的示例:

// 良好示例 - 使用函数代替三元表达式
function UserProfile({ user, isAdmin, isOwner }) {
  function getUserRole() {
	if (isAdmin) {
	  return 'Admin';
	} else if (isOwner) {
	  return 'Owner';
	} else {
	  return 'User';
	}
  }

  return (
	<div>
	  <p>{getUserRole()}</p>
	</div>
  );
}

通过使用函数,我们使代码更易读和维护。

8. 不定义属性类型或不解构属性

为组件的属性定义类型和解构属性是一种良好的实践,它有助于提高代码的可维护性和稳定性。在日常工作中,我们应该使用PropTypesTypeScript等工具来为属性添加类型定义,并解构属性以使其更清晰。以下是一个示例:

// 不良示例 - 未定义属性类型和未解构属性
function Person(props) {
  return (
	<div>
	  <p>Name: {props.name}</p>
	  <p>Age: {props.age}</p>
	</div>
  );
}

// 良好示例 - 定义属性类型和解构属性
import PropTypes from 'prop-types';

function Person({ name, age }) {
  return (
	<div>
	  <p>Name: {name}</p>
	  <p>Age: {age}</p>
	</div>
  );
}

Person.propTypes = {
  name: PropTypes.string,
  age: PropTypes.number,
};

通过定义属性类型和解构属性,可以提高代码的可读性,并在属性类型错误时获得警告。

9. 较大的应用程序没进行代码拆分

对于大型React应用程序,应该考虑使用代码拆分(Code Splitting)以提高初始加载性能。代码拆分允许将代码分割为较小的块,这些块可以在需要时加载,从而减小初始包的大小。以下是一个示例:

import Loadable from 'react-loadable';

const AsyncComponent = Loadable({
  loader: () => import('./AsyncComponent'),
  loading: () => <div>Loading...</div>,
});

function App() {
  return (
	<div>
	  <AsyncComponent />
	</div>
  );
}

通过使用代码拆分,可以提高应用程序的加载速度,特别是对于较大的应用程序。

结论

React开发中,避免这九个不良习惯可以提高代码质量、性能和可维护性。通过使用示例代码来说明这些问题以及如何避免它们,可以帮助我们在日常工作中编写更高质量的React应用程序。

与日常工作中需要避免的9个React坏习惯相似的内容:

日常工作中需要避免的9个React坏习惯

前言 React是前端开发领域中最受欢迎的JavaScript库之一,但有时候在编写React应用程序时,可能陷入一些不佳的习惯和错误做法。这些不佳的习惯可能导致性能下降、代码难以维护,以及其他问题。在本文中,我们将探讨日常工作中应该避免的9个坏React习惯,并提供相关示例代码来说明这些问题以及如

React + Springboot + Quartz,从0实现Excel报表自动化

一、项目背景 企业日常工作中需要制作大量的报表,比如商品的销量、销售额、库存详情、员工打卡信息、保险报销、办公用品采购、差旅报销、项目进度等等,都需要制作统计图表以更直观地查阅。但是报表的制作往往需要耗费大量的时间,即使复用制作好的报表模版,一次次周期性对数据的复制粘贴操作也很耗人,同时模版在此过程

[换帖]Linux命令之iconv命令

一、命令简介 日常工作中我们需要将windows生成的文件上传到Linux系统,有时候会因为编码问题出现显示乱码。例如我上传了一个csv文件到Linux服务器上,默认编码为GB2312,在Linux打开则会出现乱码,我们需要将文件进行编码转换。iconv命令对于给定文件把它的内容从一种编码转换成另一

[转帖]Jmeter笔记:使用Jmeter向kafka发送消息

https://www.cnblogs.com/daydayup-lin/p/14124816.html 日常工作中有时候需要向kafka中发送消息来测试功能或者性能,这时候我们怎么办呢?我之前是自己写个简单的python脚本来模拟发送消息的,其实用Jmeter来实现也比较简单方便。 1、我们必须有

[转帖]Shell 脚本实现应用服务日志入库 Mysql

今天给大家分享一个 shell 脚本工具,通过 shell 脚本与 mysql 的结合,将某个具体服务的错误输出日志入库到指定的 mysql 表中,以便于进行错误问题的定位与分析。 日常工作中,经常需要和 linux 系统打交道,例如:服务部署、日志和服务状态查看等,而 shell 脚本是和 lin

#Powerbi 利用时间智能函数,进行周度分析

在实际工作中,我们往往需要同比分析,月度和年度的分析都有对应的时间智能函数,分别是MTD和YTD,但是缺少了周度的时间智能函数,而 恰恰日常工作中,我们又需要以周度来进行对应的分析,今天我们来学习一下,如何使用Powerbi来进行周度分析。 我们这里假设要进行流量的周度分析,流量表里包含了日期、曝光

#Powerbi 利用视觉对象着色地图,制作数据地图

日常工作中,有时我们会遇到需要地图来展示我们的数据场景,利用POWERBI,我们可以快速的制作自己的业务地图。 Powerbi自带了三大地图,今天我们用到的是形状地图。 步骤讲解: 第一步:下载对应的地图资源,可以是全国的,也可以是具体省市的,这个根据我们的具体业务来进行选择。 http://dat

#Powerquery 利用M函数合并文件(CSV、Text、Xlsx)

在日常工作中,我们往往会遇到多个文件需要合并的情况,本文一起探讨一下利用M函数合并文件的案例。 由于需要合并的文件的格式不同,也需要选择不同的M函数来进行合并,本文将分享三个格式的合并案例。 首先介绍一下合并步骤, 1:对新建一个新查询,数据源选择为目标文件的路径。 2:点击转化数据 3:添加一个自

#PowerBi 1分钟学会,powerbi中行列值拼接(COMBINEVALUES与CONCATENATEX)

在日常的工作中,我们往往需要对表格数据的拼接,用来生成一些复合数据列,如下图类似场景。 其实,在powerbi中,我们同样也可以对表格文本进行拼接。今天我们就介绍两个DAX函数,COMBINEVALUES(表函数,新建列)与 CONCATENATEX(度量值)。示例数据表: 一:COMBINEVAL

《最新出炉》系列入门篇-Python+Playwright自动化测试-47-自动滚动到元素出现的位置

1.简介 在我们日常工作中或者生活中,经常会遇到我们的页面内容较多,一个屏幕范围无法完整展示内容,我们就需要滚动滚动条去到我们想要的地方,如下图页面,我们虽然在豆瓣首页,但是内容并不完整,如果我们想要直接点击电影模块中的选电影按钮,是需要往下滑动的。当页面超过屏幕的高度时候,需要滚动到元素出现的位置