iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >React新文档滥用effect问题怎么解决
  • 595
分享到

React新文档滥用effect问题怎么解决

2023-07-02 15:07:50 595人浏览 独家记忆
摘要

这篇文章主要介绍了React新文档滥用effect问题怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇React新文档滥用effect问题怎么解决文章都会有所收获,下面我们一起来看看吧。引言你或你的同事在

这篇文章主要介绍了React新文档滥用effect问题怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇React新文档滥用effect问题怎么解决文章都会有所收获,下面我们一起来看看吧。

    引言

    你或你的同事在使用useEffect时有没有发生过以下场景:

    当你希望状态a变化后发起请求,于是你使用了useEffect

    useEffect(() => {  fetch(xxx);}, [a])

    这段代码运行符合预期,上线后也没问题。

    随着需求不断迭代,其他地方也会修改状态a。但是在那个需求中,并不需要状态a改变后发起请求。

    你不想动之前的代码,又得修复这个bug,于是你增加了判断条件:

    useEffect(() => {  if (xxxx) {    fetch(xxx);  }}, [a])

    某一天,需求又变化了!现在请求还需要b字段。

    这很简单,你顺手就将b作为useEffect的依赖加了进去:

    useEffect(() => {  if (xxxx) {    fetch(xxx);  }}, [a, b])

    随着时间推移,你逐渐发现:

    • 是否发送请求与if条件相关

    • 是否发送请求还与a、b等依赖项相关

    • a、b等依赖项又与很多需求相关

    根本分不清到底什么时候会发送请求,真是头大...

    如果以上场景似曾相识,那么React新文档里已经明确提供了解决办法。

    一些理论知识

    新文档中这一节名为Synchronizing with Effects,当前还处于草稿状态。

    但是其中提到的一些概念,所有React开发者都应该清楚。

    首先,effect这一节隶属于Escape Hatches(逃生舱)这一章。

    React新文档滥用effect问题怎么解决

    从命名就能看出,开发者并不一定需要使用effect,这仅仅是特殊情况下的逃生舱。

    React中有两个重要的概念:

    Rendering code(渲染代码)

    Event handlers(事件处理器)

    Rendering code指开发者编写的组件渲染逻辑,最终会返回一段jsX

    比如,如下组件内部就是Rendering code

    function App() {  const [name, update] = useState('KaSong');  return <div>Hello {name}</div>;}

    Rendering code的特点是:他应该是不带副作用的纯函数。

    如下Rendering code包含副作用(count变化),就是不推荐的写法:

    let count = 0;function App() {  count++;  const [name, update] = useState('KaSong');  return <div>Hello {name}</div>;}

    处理副作用

    Event handlers是组件内部包含的函数,用于执行用户操作,可以包含副作用

    下面这些操作都属于Event handlers

    • 更新input输入框

    • 提交表单

    • 导航到其他页面

    如下例子中组件内部的changeName方法就属于Event handlers

    function App() {  const [name, update] = useState('KaSong');  const changeName = () => {    update('KaKaSong');  }  return <div onClick={changeName}>Hello {name}</div>;}

    但是,并不是所有副作用都能在Event handlers中解决。

    比如,在一个聊天室中,发送消息是用户触发的,应该交给Event handlers处理。

    除此之外,聊天室需要随时保持和服务端的长连接,保持长连接的行为属于副作用,但并不是用户行为触发的。

    对于这种:在视图渲染后触发的副作用,就属于effect,应该交给useEffect处理。

    回到开篇的例子:

    当你希望状态a变化后发起请求,首先应该明确,你的需求是:

    状态a变化,接下来需要发起请求

    还是

    某个用户行为需要发起请求,请求依赖状态a作为参数?

    如果是后者,这是用户行为触发的副作用,那么相关逻辑应该放在Event handlers中。

    假设之前的代码逻辑是:

    • 点击按钮,触发状态a变化

    • useEffect执行,发送请求

    应该修改为:

    • 点击按钮,在事件回调中获取状态a的值

    • 在事件回调中发送请求

    经过这样修改,状态a变化与发送请求之间不再有因果关系,后续对状态a的修改不会再有无意间触发请求的顾虑。

    关于“React新文档滥用effect问题怎么解决”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“React新文档滥用effect问题怎么解决”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

    --结束END--

    本文标题: React新文档滥用effect问题怎么解决

    本文链接: https://www.lsjlt.com/news/342985.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • MySQL怎么更新字段长度
      要更新MySQL表中的字段长度,可以使用ALTER TABLE语句。以下是更新字段长度的示例: ALTER TABLE table_...
      99+
      2024-05-14
      mysql
    • sql如何修改表字段长度
      要修改表字段的长度,可以使用ALTER TABLE语句,然后使用MODIFY COLUMN来修改字段的长度。以下是一个示例: ALT...
      99+
      2024-05-14
      sql
    • mysql数据量太大如何解决
      有几种方法可以解决MySQL数据量过大的问题: 数据库分区:将数据库表按照某种规则进行分区,分成多个小表,可以提高查询速度和管理...
      99+
      2024-05-14
      mysql
    • MySQL单表数据量过大如何解决
      在MySQL中,当单表的数据量过大时,可以采取以下几种方法来解决问题: 使用索引:在表的字段上创建适当的索引,可以提高查询效率,...
      99+
      2024-05-14
      mysql
    • mysql导出数据量过大如何解决
      当导出的数据量过大时,可以尝试以下方法来解决问题: 使用数据库工具:使用数据库管理工具如Navicat或MySQL Workbe...
      99+
      2024-05-14
      mysql
    • mysql中log_bin的作用是什么
      在MySQL中,log_bin是二进制日志文件的名称,用于记录所有对数据库进行更改的操作,如插入、更新、删除等。这些二进制日志文件可...
      99+
      2024-05-14
      mysql
    • mysql中log_bin的特点有哪些
      log_bin是MySQL的二进制日志文件,用于记录所有对数据库的修改操作,包括插入、更新、删除等。 log_bin文件是M...
      99+
      2024-05-14
      mysql
    • mysql rpm包安装的方法是什么
      要在Linux系统上安装MySQL RPM包,可以按照以下步骤操作: 下载MySQL的RPM包:你可以从MySQL官方网站下载适...
      99+
      2024-05-14
      mysql
    • mysql rpm包安装后怎么使用
      安装MySQL RPM包后,您可以通过以下步骤来使用MySQL: 启动MySQL服务:使用以下命令来启动MySQL服务: sud...
      99+
      2024-05-14
      mysql
    • lxml中怎么处理XML命名空间默认值
      在lxml中处理XML命名空间的默认值可以通过使用xpath()方法和register_namespace()方法来实现。...
      99+
      2024-05-14
      lxml
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作