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

React Native Google Map点击标记改颜色遇无限重渲染错误

问题原因

你直接在组件函数体顶层调用了setPropCopy,组件每次渲染都会执行这段代码,而调用setState又会触发组件重新渲染,由此形成无限循环,所以触发了"Too many re-renders"错误。

修复方案

1. 正确初始化状态

如果props.data仅在组件初始化时传入,可直接将映射逻辑放到useState的函数式初始值中,这样只会执行一次:

const [propCopy, setPropCopy] = useState(() => 
  props.data.map(v => ({...v, pincol: 'red'}))
);

如果props.data后续可能更新,需要用useEffect监听其变化来同步更新状态:

import { useEffect, useState } from 'react';

const MapComponent = ({ data }) => {
  const [propCopy, setPropCopy] = useState([]);

  useEffect(() => {
    // 仅当props.data变化时,重新生成带pincol的数组
    const newMarkerData = data.map(v => ({...v, pincol: 'red'}));
    setPropCopy(newMarkerData);
  }, [data]); // 依赖数组:只有data改变时才执行回调
  // ...
};

2. 实现点击修改标记颜色

修改状态时要遵循React的不可变原则,不能直接修改原数组,需创建新副本后更新:

const handleMarkerPress = (index) => {
  setPropCopy(prevData => {
    // 复制原数组
    const updatedData = [...prevData];
    // 修改对应索引的标记颜色,同时保留原有属性
    updatedData[index] = {...updatedData[index], pincol: 'green'};
    return updatedData;
  });
};

// 渲染Marker组件
<MapView>
  {propCopy.map((item, index) => (
    <Marker
      key={item.id} // 必须添加唯一key,避免渲染异常
      coordinate={item.coordinate}
      pinColor={item.pincol}
      onPress={() => handleMarkerPress(index)}
    />
  ))}
</MapView>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 02:35:24