首页 > 其他分享 >react 初学遇到的问题

react 初学遇到的问题

时间:2024-04-29 17:55:58浏览次数:30  
标签:selected const selectedComp 遇到 handleSendText react 初学 useEffect select

1. useEffect依赖项变化时并没有执行

源码

useEffect(() => {
  const selectedComp = selects.find(select => select.value === selected);
  selectedComp && setSelectedComp(selectedComp);
}, [selected, selects, selectedComp]);

分析

  • 从提供的代码片段来看,这一行代码本身的逻辑是在查找 selects 数组中 value 属性等于 selected 的元素,并将这个元素赋值给状态 selectedComp

  • 这段代码可能出现问题的原因主要可能包括以下几点:

1. 查找结果为 undefined:
  • 如果 selects 数组中没有任何一个元素的 value 属性与 selected 相等,find 方法将返回 undefined 。这可能不是你的预期行为,尤其是如果你后续的代码依赖于 selectedComp 总是一个有效对象的话。确保你的代码能够妥善处理这种情况:

    const selectedComp = selects.find(select => select.value === selected);
    if (selectedComp) {
      setSelectedComp(selectedComp);
    } else {
      // 处理未找到匹配项的情况,例如设置一个默认值或更新状态以反映未找到
    }
    
2. 状态更新异步性
  • setSelectedComp 是一个异步操作,这意味着状态的更新不会立即反映。如果你在调用 setSelectedComp 之后立即依赖于 selectedComp 的新值,可能会遇到问题。React 状态更新可能会被批处理,且实际更新的时机由 React 控制。正确的做法是在另一个 useEffect 中,依赖于 selectedComp 来执行需要该状态更新后的操作:

    useEffect(() => {
      //依赖于 selectedComp 的逻辑
    }, [selectedComp]);
    
3. 检查是否有错误导致中断
  • 如果 useEffect 中的代码抛出了错误,可能会导致后续代码不执行。尽管代码应该在错误之前执行,但值得确认是否有其他代码抛出了错误,特别是如果 selectedCompundefined (即没有找到配的 select ),这可能会导致问题。你可以添加 trycatch 块来捕获并查看是否有错误发生:

    useEffect(() => {
      try {
        const selectedComp = selects.find(select => select.value === selected);
        if (!selectedComp) {
          console.error("未找到匹配的 select");
          return;
        }
        setSelectedComp(selectedComp);
      } catch(error) {
        console.error("useEffect 错误:",error);
      }
    }, [selected, selects])
    

2. 函数获取不到最新的状态值

源码

// 获取答案
const handleGetAnswer = (item: AnswerFields) => {
  const { question, content, faqs } = item;

  // 答案写入 todo...
  setInputValue(question);
  handleSendText();
};
// 发送信息 且机器人回复处理
const handleSendText = async () => {
  if (!inputValue) return;
  // ...
};

分析

  • 此时 handleSendText 函数调用时,期望获得最新的 inputValue 状态值,但此时遇到问题:在 handleSendText 里获取不到最新的 inputValue 值,这是因为状态更新时异步的,而且在 set 之后立即调用的函数内使用的是旧值

解决方案

  • useEffect 中调用 handleSendText 方法

实现方式

  1. 需要增设状态值 shouldSendText 来标记是否需要发送文本

  2. 用户回车且 inputValue 有效时,setShouldSendText(true)

  3. 使用 useEffect 监听 shouldSendText,若为 true 则调用 handleSendText 且设置 setShouleSendText(false)

// 获取答案
const handleGetAnswer = (item: AnswerFields) => {
  const { question, content, faqs } = item;

  // 答案写入 todo...
  setInputValue(question);
  setShouldSendText(true);
};
// 用户回车发送消息
const handleKeyDown = event => {
  if (event.key === 'Enter') {
    setShouldSendText(true);
  }
};
// 发送信息 且机器人回复处理
const handleSendText = async () => {
  setShouldSendText(false);
  if (!inputValue) return;
  // ...
};

useEffect(() => {
  shouldSendText && handleSendText();
}, [shouldSendText]);

标签:selected,const,selectedComp,遇到,handleSendText,react,初学,useEffect,select
From: https://www.cnblogs.com/pleaseAnswer/p/18166390

相关文章

  • 升级next@13 react@18 chakra-ui@2
    一、升级步骤1、本地node建议升级到v20(next@13要求node@18,react@18、react-dom@18、chakra-ui@2)2、支持渐进式升级next13,升级的项目需按next官方添加环境变量NEXT_PUBLIC_NEXT13,请devops帮忙Dockerfile构建时添加.env文件到pod中Openimage-20240111-081926.png3......
  • reactivity api
    reactivityapi:https://v3.vuejs.org/api/reactivity-api获取响应式数据API传入返回备注reactiveplain-object对象代理深度代理对象中的所有成员readonlyplain-objectorproxy对象代理只能读取代理对象中的成员,不可修改refany{value:...}对va......
  • 一周-每天1 小时,学习实现一个简单的mini-React (三)G
    关于从0到1实现一个mini-React过程上周写了相对代码实现第一部分,本片文章接着写!崔学社mini-React完整代码whoelse666/mini-React过程-------------day05----------当日目标:实现React.useState对照React的API//一个count++的例子const[count,setCount]......
  • Python操作SAP时候遇到的一些常见问题
    1,每次使用程序去操作SAP时候,都会提示有脚本在AttachSAPGUI窗口A:可以修改在SAPGUIConfiguration中的设置,取消该提示 2,使用程序去操作SAP的时候,SAP无法找到Edit窗口,不会输入SAP系统A:可能是误点了下图的CommentField,这样会出现下面的Comment窗口。但是这个和填写S......
  • K8S上生产环境后,90%都会遇到这个故障
    K8S上生产环境后,90%都会遇到这个故障原创 didiplus 攻城狮成长日记 2024-03-2621:30 广东 听全文在Kubernetes/K8s上生产环境中,90%的人都会遇到的一个故障,K8s集群突然有一天执行kubectl命令时,报错提示509证书过期。返回如下报错信息:Unabletoconnecttotheserv......
  • 记录一些写代码遇到的小错误
    写代码时报错:SyntaxError:Non-UTF-8codestartingwith'\xbc'infileE:\pythonproject\flaskProject2\model\KSql_clean.pyonline5,butnoencodingdeclared;seehttps://peps.python.org/pep-0263/fordetails这个错误通常表示您的Python文件包含非UTF-8编码......
  • vue和react有什么区别?
    (1)核心思想不同 vue:灵活易用的渐进式框架,进行数据拦截/代理,它对侦测数据的变化更敏感、更精确 react:React推崇函数式编程(纯组件),数据不可变以及单向数据流,当然需要双向的地方也可以手动实现,比如借助onChange和setState来实现(2)组件写法差异 vue:Vue推荐的做法是template......
  • 详细:docker手动部署lnmp以及记录遇到的问题
    一、基本思路(背景)部署时间:2024.04.25主机为deepin20.9安装好docker,从官网下载nginxphpmysql三个镜像设置并启动相应三个容器,并配置portainer二、安装docker1.如果以前安装过老版本,请先卸载以前版本sudoaptremovedockerdocker-engine2.安装docker-ce与密钥管理与下......
  • 笔记本1050ti运行DLinear模型遇到的问题
    1、windows没法运行shgitbash可以,但我需要在conda环境中,使用sh运行脚本,所以应该在安装conda后,先配环境变量,然后在gitbash窗口中执行condainitbash,就可以用在bash窗口中通过condaactivate进入conda环境了。2、运行sh,报错加载不到模块看报错最后一行上面的模块,pipuninsta......
  • React 《useEffect》
    概念useEffect是一个ReactHook函数,用于在React组件中创建不是由事件引起而是由渲染本身引起的操作(副作用),比如发送AJAX请求,更改DOM等等:::warning说明:上面的组件中没有发生任何的用户事件,组件渲染完毕之后就需要和服务器要数据,整个过程属于“只由渲染引起的操作”:::基础......