You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将React Class Component代码片段改写为Functional Component

修改方案

第一步:补全缺失的导入

你当前代码未导入React核心hooks,在文件顶部添加以下代码:

import React, { useState, useEffect, useCallback } from 'react';

第二步:修改handleSearch方法

函数式组件的状态更新没有类组件setState的回调参数,结合你已配置监听query变化的useEffect,直接更新对应状态即可,useEffect会在query更新后自动触发请求,完全匹配原逻辑:

const handleSearch = (text) => {
  const formattedQuery = text.toLowerCase();
  const filteredData = _.filter(fullData, (user) => {
    return contains(user, formattedQuery);
  });
  // 替换原注释代码段
  setData(filteredData);
  setQuery(text);
};

建议将过滤后的变量重命名为filteredData,避免和状态变量data重名造成作用域混淆。

第三步:修复防抖失效问题(可选但推荐)

当前makeRemoteRequest在每次组件渲染时都会重新生成,导致防抖逻辑失效,可通过useCallback包裹防抖函数解决,同时给query添加初始空字符串避免参数异常:

// 调整query初始值
const [query, setQuery] = useState('');

// 用useCallback包裹防抖函数,仅初始化一次
const makeRemoteRequest = useCallback(_.debounce((q) => {
  setLoading(true);
  getUsers(20, q)
    .then((users) => {
      setLoading(false);
      setData(users);
      setFullData(users);
    })
    .catch((error) => {
      setLoading(false);
      setError(error);
    });
}, 250), []);

// 调整useEffect,传递最新query参数
useEffect(() => {
  makeRemoteRequest(query);
},[query, makeRemoteRequest]);

这样可以彻底避免闭包陷阱导致的请求参数错误、防抖不生效的问题。

内容的提问来源于stack exchange,提问作者Samim Hakimi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 23:54:04