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

React中如何实现选中城市时修改对应动态列表项的背景色

实现方案

你现在的核心问题是渲染城市列表时,没有将states里的城市项和cities状态中的isActive字段做关联,只要补上关联逻辑、动态绑定类名即可实现选中背景变色效果,你原本的图片配置逻辑已经支持不同城市自定义相同/不同图片,不需要额外修改。

1. 优化城市切换方法(可选,规范不可变更新)

原来的写法直接修改了map遍历的原对象,建议调整为返回新对象避免副作用:

function handleChangeCity(name) {
  const cityChanged = cities.map((city) => ({
    ...city,
    isActive: city.name === name,
    arrowActive: city.name === name
  }));
  setCities(cityChanged);
}

2. 改造城市列表渲染逻辑,动态绑定激活类名

渲染每个city-block时,先从cities状态中查询当前城市是否处于激活状态,动态追加激活类:

<div className="scroll">
  {states?.map(state => (
    <div key={state.name} className="cidade">
      <header className="header">
        <h1 className="font-bold">{state.name}</h1>
      </header>
      {state.cities.map(city => {
        // 过滤空城市名,同时查询当前城市激活状态
        if (!city) return null;
        const activeCity = cities.find(item => item.name === city);
        const isActive = activeCity?.isActive ?? false;
        return (
          <div 
            key={city} 
            // 动态拼接类名,激活时追加active类
            className={`city-block ${isActive ? 'active' : ''}`}
          >
            <label className="label" htmlFor="content">
              {city}
            </label>
            <input type="radio" name="radio" className="single" onClick={() => handleChangeCity(city)} />
          </div>
        )
      })}
    </div>
  ))}
</div>

注意:原来的label的for属性在JSX里要写htmlFor,不然会有语法警告。

3. 补充CSS样式

给激活状态的city-block加自定义背景色即可:

.city-block.active {
  /* 替换为你需要的背景色 */
  background-color: #e6f7ff;
  border-radius: 4px;
}

多图片配置说明

你原本的结构已经支持每个城市自定义图片,只要在初始化cities状态时,给对应城市的images数组添加多个图片对象即可:

const [cities, setCities] = useState([
  {
    name: "Divinópolis",
    isActive: false,
    images: [
      {
        image: imgLogoTIVerde,
        paragraph: "Special Sales e Technical Support",
      },
      // 追加更多图片即可
      {
        image: 你的其他图片变量,
        paragraph: "其他描述",
      }
    ],
  }
])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 23:45:01