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

React useState实现:添加元素时保留已有元素随机位置不变

问题解决思路与代码修改

核心问题在于每次组件重新渲染时,所有元素的位置都会重新调用randomNum生成新值,而添加新元素会触发组件重新渲染,导致原有元素位置也跟着变化。解决方法是把每个元素的随机位置和数据绑定,一次性生成后不再改变。

步骤1:修改数据结构,新增位置字段

让每个姓名元素包含top和right位置信息,这样位置会和数据一起被持久化存储。

步骤2:添加新元素时生成随机位置

在add函数中,新增元素的同时就生成对应的随机位置,而不是渲染时临时生成。

修改后的代码示例

随机数生成函数(不变)

const randomNum = (min: number, max: number): number => {
  return Math.floor(Math.random() * (max - min + 1) + min);
};

更新添加函数

function add(id: number) {
  setData(
    update(data, {
      data: {
        $push: [
          {
            name: '',
            id,
            // 添加新元素时直接生成随机位置
            top: `${randomNum(0, 51)}%`,
            right: `${randomNum(0, 51)}%`,
          },
        ] as any,
      },
    })
  );
}

渲染元素时直接使用存储的位置

const elements = data.data.map((el) => {
  return (
      <div
        style={{
          position: 'absolute',
          // 直接读取数据中保存的位置,不再重新生成
          top: el.top,
          right: el.right,
        }}
      >
        {el.name}
      </div>
  );
});

初始化数据的补充

如果有初始姓名数据,初始化时也要给每个元素添加上随机位置:

const [data, setData] = useState({
  data: [
    { 
      name: '初始姓名1', 
      id: 1, 
      top: `${randomNum(0,51)}%`, 
      right: `${randomNum(0,51)}%` 
    },
    // 其他初始元素
  ]
});

这样修改后,只有新增的元素会生成新的随机位置,原有元素的位置会从状态中读取,不会随组件重新渲染而改变。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 16:38:33