首页 > 其他分享 >如何编写难以维护的React代码?——滥用useEffect

如何编写难以维护的React代码?——滥用useEffect

时间:2023-07-25 18:13:16浏览次数:40  
标签:filter const 滥用 ... list React filteredList useEffect

如何编写难以维护的React代码?——滥用useEffect

在许多项目中,我们经常会遇到一些难以维护的React代码。其中一种常见的情况是滥用useEffect钩子,特别是在处理衍生状态时。让我们来看一个例子:

const ComponentA = ({ list }) => {
  const [filteredList, setFilteredList] = useState(list);
  const [filter, setFilter] = useState({});

  useEffect(() => {
    setFilteredList(_.filter(list, filter));
  }, [filter]);

  /*...*/

  return (
    <>
      {/*...*/}
      <Filter filter={filter} onChange={setFilter} />
      <List data={filteredList} />
      {/*...*/}
    </>
  );
};

事实上,filteredList 是一个衍生状态,可以通过计算 list 和 filter 得出:list + filter => filteredList。所以可以优化成这样:

const ComponentB = ({ list }) => {
  const [filter, setFilter] = useState({});
  const filteredList = useMemo(() => _.filter(list, filter), [list, filter]);

  /*...*/

  return (
    <>
      {/*...*/}
      <Filter filter={filter} onChange={setFilter} />
      <List data={filteredList} />
      {/*...*/}
    </>
  );
};

在改进后的代码中,我们使用了 useMemo 来计算 filteredList,这样可以避免滥用 useState 和 useEffect。通过传入依赖数组 [list, filter],只有在 list 或 filter 发生变化时,才会重新计算 filteredList,从而优化性能。

减少状态的使用可以有助于降低代码的复杂性,减少潜在的错误。使用 useMemo 可以将计算逻辑从渲染过程中抽离出来,使代码更易于维护和理解。Less States, Less Bugs.

总结:简洁且高效的代码是开发者的追求目标,它不仅有助于减少错误,而且在项目的长期维护中也更容易被团队成员理解与修改。

标签:filter,const,滥用,...,list,React,filteredList,useEffect
From: https://www.cnblogs.com/forzhaokang/p/17579785.html

相关文章

  • React函数式组件渲染顺序探究(Demo)
    参考资料:React渲染顺序及useEffect执行顺序探究(含并发模式)codeimport{useEffect,useState}from"react";import{Button}from"antd";functionComponent({name,children}){const[state,setState]=useState(()=>{console.log(`C......
  • react批量生成pdf
    使用htmlpdf.js批量将html页面转为pdf,打包成zip下载。htmlpdf.js是结合html2canvas和jsPDF实现的。首先先安装包npminstall--savehtml2pdf.js基本页面importhtml2pdffrom"html2pdf.js";functionApp(){consthandleExportPdf=()=>{//导出pdf......
  • vue3中组合式 API_为 reactive() 标注类型
    reactive() 也会隐式地从它的参数中推导类型<template><h3>{{book.title}}</h3><h3>{{book.author}}</h3></template><scriptsetuplang="ts">import{reactive}from"vue"constbook=reactive({title......
  • 探索Reactor网络模型在当今应用领域的革新
    本文分享自华为云社区《驾驭网络技术的未来:探索Reactor网络模型在当今应用领域的革新》,作者:LionLong。本文介绍了Linux网络设计中的Reactor网络模型及其在实际应用中的重要性。Reactor模型是一种经典的事件驱动设计模式,广泛应用于构建高性能、可扩展的网络服务器。我们将探讨R......
  • io.reactivex.rxjava3:rxjava
    如何使用io.reactivex.rxjava3:rxjava概述在本文中,我将向您介绍如何使用io.reactivex.rxjava3:rxjava。rxjava是一个流行的响应式编程库,它提供了丰富的操作符和工具,用于简化异步操作和事件处理。以下是我们将要讨论的步骤概览:步骤动作代码示例1添加依赖implementa......
  • React的坑
    1.react中没有computed属性,没有watch这个很伤,简单的使用ES6class的get属性,根本不能解决问题,setState之后,级联属性不能自动刷新视图不用mobx,只能自己去setState依赖属性,而且依赖属性如果使用,state.属性名,去读取属性则不能再setState源属性的同时,设置依赖属性,因为依赖属性无法......
  • Reactjs学习-props, state, render之间的关系以及虚拟Dom
    本篇是关于React的基础-渲染以及虚拟domprops,state, render之间的关系当组件的state或者props发生改变时,render函数重新执行当父组件的render函数执行时,子组件的render函数也会重新执行2.虚拟Dom产生背景:react是视图层的框架,数据加JSX模板构成我们的视图,数据会发生改变......
  • 基于Avalonia 11.0.0+ReactiveUI 的跨平台项目开发2-功能开发
    基于Avalonia11.0.0+ReactiveUI的跨平台项目开发2-功能开发项目简介:目标是开发一个跨平台的AI聊天和其他功能的客户端平台。目的来学习和了解Avalonia。将这个项目部署在openKylin1.0的系统上。为什么使用Avalonia:之前已经了解了基于Avalonia的项目在国产麒麟系统中运行的......
  • react-native 调用手机自带分享
    实现效果 importSharefrom'react-native-share'importViewShotfrom'react-native-view-shot'constshotRef=useRef<ViewShot>(null)constgetTime=()=>{returnnewDate().getTime().toString()}constOnShare=()=&g......
  • Reactjs学习-组件之间传值
    本篇是关于React的基础-父子组件之间传值子组件想使用父组件的某个属性父组件就需要把这个属性传递给子组件,子组件就可以用this.props.属性名来接收子组件调用父组件的方法父组件就需要把这个方法以属性的方式传递给子组件,子组件就可以用this.属性名来调用,要注意this指向......