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

React自定义国家选择Hook出现无限循环,求优化方案

问题分析与解决方案

你的代码出现无限循环的核心原因是:在Hook的顶层直接调用setCountries。每次组件渲染时都会执行这个Hook,调用setCountries会触发组件重新渲染,重新渲染又会再次执行Hook并调用setCountries,形成无限循环。

优化方案

方案1:仅初始化时过滤(适用于默认值固定的场景)

如果defaultCountries和defaultCountry是固定不变的,直接把过滤逻辑放到useState的初始值中,这样只会在Hook首次执行时计算一次,避免重复更新:

const { useState } = require("react");

const useCountrySelect = (defaultCountries, defaultCountry) => {
  // 初始值直接传入过滤后的结果
  const [countries, setCountries] = useState(() => {
    return defaultCountries.filter(country => country !== defaultCountry);
  });

  return [countries, setCountries];
};

export default useCountrySelect;

方案2:响应默认值变化(适用于默认值可能动态更新的场景)

如果defaultCountries或defaultCountry会动态变化,需要用useEffect监听依赖变化,仅当依赖更新时才重新过滤并更新countries:

const { useState, useEffect } = require("react");

const useCountrySelect = (defaultCountries, defaultCountry) => {
  const [countries, setCountries] = useState([]);

  useEffect(() => {
    // 仅当defaultCountries或defaultCountry变化时执行过滤
    const filteredCountries = defaultCountries.filter(country => country !== defaultCountry);
    setCountries(filteredCountries);
  }, [defaultCountries, defaultCountry]); // 依赖数组控制执行时机

  return [countries, setCountries];
};

export default useCountrySelect;

使用说明

两种方案的使用方式和你原来的示例保持一致:

const [country] = useCountrySelect(["lv", "ee", "lt"], "lt");
console.log(country); // 输出 ["lv", "ee"]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 23:24:32