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

在React中实现点击时每次创建新空div的方式是否正确?

你的实现是否正确?

首先明确说:你的代码功能上确实能实现每次点击创建新的空div——每次点击时,通过parentRef.current拿到对应的DOM元素,调用原生appendChild方法添加新div,这个逻辑是能正常运行的。

但从React的设计理念和最佳实践来看,这并不是推荐的做法,原因如下:

  • 绕过了React的状态管理与虚拟DOM机制:React的核心是通过状态变化驱动UI更新,所有UI变化都应由状态管控。直接操作原生DOM会让新增的div脱离React追踪,后续如果需要修改这些div的内容、样式或删除它们,会变得非常麻烦,还容易出现UI与状态不一致的bug。
  • 维护性差:当组件因父组件更新或自身状态变化重新渲染时,React不会感知到这些手动添加的DOM元素,一旦出问题,排查难度会很高。

更符合React风格的实现方式

推荐使用useState来追踪需要渲染的div列表,通过状态变化触发UI更新,示例代码如下:

import "./styles.css";
import { useState } from "react";

export default function App() {
  // 用数组状态存储每个div的唯一标识(也可存储div的配置信息)
  const [divList, setDivList] = useState([]);

  const createNewDiv = () => {
    // 每次点击向数组添加新的唯一标识,用时间戳保证唯一性
    setDivList(prevList => [...prevList, `unique-div-${Date.now()}`]);
  };

  return (
    <div className="App">
      <div onClick={createNewDiv}>clickHere</div>
      {/* 将状态列表映射为对应的div元素 */}
      <div className="div-container">
        {divList.map(divId => (
          <div key={divId} />
        ))}
      </div>
    </div>
  );
}

这种方式的优势很明显:

  • 状态与UI完全同步:所有div的创建、修改、删除都由状态控制,React会自动处理虚拟DOM更新,保证UI与状态一致。
  • 易于扩展:后续如果要给div加内容、样式或事件监听,只需修改状态数据或渲染逻辑即可,无需手动操作DOM。
  • 代码更易理解维护:其他开发者一眼就能明白UI是如何被状态驱动的,符合React社区的通用写法。

总结:你的原始代码能实现需求,但不是React的最佳实践。如果是简单演示场景可以用,但实际项目中,强烈建议使用状态驱动的方式来实现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 09:27:34