如何在 React 中添加新元素(新节点)?

Posted

技术标签:

【中文标题】如何在 React 中添加新元素(新节点)?【英文标题】:How can I append a new element (new node) in React? 【发布时间】:2018-01-28 04:03:15 【问题描述】:

我想在单击按钮(加号)时附加一个新输入(新节点)。我通过appendChild(input) 实现了这一点。新输入出现在屏幕上,我可以在 Developer Tools > Elements 中看到它,但 React 看不到它

Developer Tools > Elements

Developer Tools > React

onClickPlus(event) 
   event.preventDefault();
   let button = event.currentTarget;
   let input = button.previousSibling.cloneNode(true);
   let name = input.getAttribute("name").split(".");
   let newName = name[0] + '.' + (Number(name[1]) + 1);
   input.setAttribute("name", newName);
   let parent = button.parentNode;
   parent.appendChild(input);
   parent.appendChild(button);

我怎样才能正确地实现这个?

【问题讨论】:

使用状态! facebook.github.io/react-native/docs/state.html React 不是 jquery! @Maxwelll 谢谢 【参考方案1】:

我会避免“手动”操作 DOM,因为它会改变 DOM 树并影响协调过程。这将导致 react 组件的完全重新渲染,并将显着影响性能。

相反,我会使用状态变量 ej。 “可见”点击方法将在点击时更新。

onClickPlus(event) 
   event.preventDefault();
   this.setState(visible: true)

如果您需要在用户单击 + 按钮时呈现多个输入实例,最好的办法是在状态中包含这些实例的数组。

constructor(props)
     super(props)
     this.state = 
        inputElements: []
     


onClickPlus(event) 
   event.preventDefault();
   this.setState(
    inputElements: this.state.inputElement.concat(newElementId)
   )

并在渲染时迭代 inputElement 数组。这样,您还可以有一个 - 按钮来消除输入字段。

对于具有全局状态的动态反应表单,强烈建议使用 redux-form FieldArray。

【讨论】:

非常感谢!但我认为你不能使用'push',mb'concat'? 是的。 Push 不会返回一个新数组,但 concat 会。好点子!

以上是关于如何在 React 中添加新元素(新节点)?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 React 组件中向 Apollo 客户端添加新的授权标头?

在 React 中向 DOM 添加新元素

如何优化在`django-mptt`中添加新节点?

如何使用 selenium 重新加载 html DOM,以便新命令能够定位新节点?

JavaScript HTML DOM 元素 (节点)

如何搜索 xml 节点值,然后在 c# 中为该元素创建新属性