当前位置: 首页 > 面试题库 >

React:我可以操纵React渲染的DOM多少?

纪勇军
2023-03-14
问题内容

这就是我在做什么:jsfiddle

关键部分是:

position: function() {
  var container = $(this.getDOMNode());
  this._menu = $(this.refs.menu.getDOMNode());
  this._menu.appendTo(document.body).
      offset({
          top: container.offset().top + 
              container.outerHeight(),
          left: container.offset().left
      });
},
restore: function() {
  this._menu.appendTo(this.getDOMNode());      
},
componentWillUpdate: function() {
  this.restore();
},
componentDidUpdate: function() {
  this.position();
},
componentDidMount: function() {
  this.position();
},

现在,这很好用。我在组件更新之前将内容放回原处,并假设React在每次更新之间都留有DOM,并且不会错过它。实际上,React似乎可以移动内容(如果我删除componentWillUpdatecomponentDidUpdate,则定位的元素仍会更新!)

我的问题是,有多少假设是安全的(即,如果我假设这些事情,我的代码会在React的未来版本中中断吗?):

  • 只要您将DOM放回原处,React就不会在更新之间移动DOM componentWillUpdate
  • React事件处理程序仍将对已移动的元素起作用。
  • React会将您要求的任何内联样式与元素上已经存在的样式合并(即使它没有设置它们)。
  • 即使您将DOM移动到文档中的其他位置,React也会更新它已经渲染的DOM!

对于我来说,最后一个似乎有些极端和神奇,但如果成立的话,则具有一些重大意义。


问题答案:

我是React开发人员 我将回答您的每个问题:

只要您将DOM重新放回componentWillUpdate中,React就不会在更新之间移动DOM。

正确-除了更新时,React不会查看DOM,事件处理程序除外:

React事件处理程序仍将对已移动的元素起作用。

我不会依靠这一点,而且我不确定现在是否如此。

React会将您要求的任何内联样式与元素上已经存在的样式合并(即使它没有设置它们)。

我也不会依赖它-现在React设置了单个属性,但是我可以很容易地想象它的设置el.style.cssText是否更快,这会破坏您所做的单个更改。

即使您将DOM移动到文档中的其他位置,React也会更新它已经渲染的DOM!

我不认为目前这是真的,您也不应该依赖于此。

广义上讲,您不应该手动操作React创建的DOM。<div>在React中创建一个空白并手动填充是100%的粗略操作;只要您以后不尝试在React中更改其属性(使React进行DOM更新),甚至可以修改React呈现的元素的属性,但是如果您移动一个元素,React可能会寻找并找不到时会感到困惑。

希望有帮助。



 类似资料:
  • 主要内容:React 实例,元素变量,React 实例,与运算符 &&,React 实例,三目运算符,阻止组件渲染,React 实例在 React 中,你可以创建不同的组件来封装各种你需要的行为。然后还可以根据应用的状态变化只渲染其中的一部分。 React 中的条件渲染和 JavaScript 中的一致,使用 JavaScript 操作符 if 或条件运算符来创建表示当前状态的元素,然后让 React 根据它们来更新 UI。 先来看两个组件: 我们将创建一个 Greeting 组件,它会根据用户

  • 主要内容:实例,实例,实例,实例元素是构成 React 应用的最小单位,它用于描述屏幕上输出的内容。 与浏览器的 DOM 元素不同,React 当中的元素事实上是普通的对象,React DOM 可以确保 浏览器 DOM 的数据内容与 React 元素保持一致。 将元素渲染到 DOM 中 首先我们在一个 HTML 页面中添加一个 id="example" 的 <div>: 在此 div 中的所有内容都将由 React DOM 来管

  • 问题内容: 我在尝试使用数据数组呈现元素时遇到问题。在的下面的代码中,可以正常工作,但列表项未出现。 我究竟做错了什么?请随时指出并非最佳做法的任何内容。 问题答案: GoshaArinich是正确的,您应该返回您的元素。但是,在这种情况下,您应该在浏览器控制台中收到讨厌的红色警告 数组或迭代器中的每个子代都应具有唯一的“键”道具。 因此,您需要在列表中添加“键”: 或使用es6 箭头功能放下并做

  • 我有一个问题,我正在尝试将值设置为一个状态(选定的Pathway),关于通过 redux 设置的另一个常量(国家标签)。 设置“selectedPatway”后,我想在<code>中显示结果 一切都很好,但是当我刷新页面时,我在浏览器中得到一个“渲染的钩子比之前渲染的钩子多”。这是代码: 我浏览了整个互联网,我认为我已经正确地应用了所有东西(显然不是因为它不工作…)。 不有条件地调用钩子 在顶层使

  • 问题内容: 我有一个带有一些componentDidMount逻辑的React组件: 是否可以通过props传递此组件,以便componentDidMount()中的所有内容都被执行,以某种方式伪造以便截取屏幕截图?遵循以下原则: 我知道我可以使用,但是我有一些复杂的登录逻辑,我想使用这样的快捷方式来避免,而是将所有需要的道具直接传递给组件? 问题答案: 在这里回答了这个问题。让我们在这里尝试相同

  • 所以基本上我有一个导航栏,可以在路线之间切换。当页面加载时,默认情况下会转到/home,但实际上不会呈现所提供的应用程序组件。我必须单击将您带到/主页的按钮才能渲染此内容。 我使用Redux的反应路由器。 这是我的浏览器路由器: 有什么建议吗?