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

更新渲染元素(不可变)

邢运良
2023-03-14
问题内容

在React教程中,它说

React元素是不可变的。创建元素后,就无法更改其子级或属性。元素就像电影中的单个帧:它表示特定时间点的UI。到目前为止,根据我们的知识,更新UI的唯一方法是创建一个新元素并将其传递给ReactDOM.render()。

在下一个标题中,它说

仅反应更新需要什么

React DOM将元素及其子元素与上一个元素进行比较,并且仅应用必要的DOM更新以使DOM达到所需状态。

他们举的例子-

function tick() {
  const element = (
    <div>
      <h1>Hello, world!</h1>
      <h2>It is {new Date().toLocaleTimeString()}.</h2>
    </div>
  );
  ReactDOM.render(element, document.getElementById('root'));
}

setInterval(tick, 1000);

在此示例中,React Only更新<h2>It is {new Date().toLocaleTimeString()}.</h2代码的时间-

行。因为这只是必要的更改,但是我无法理解React如何更改他们提到的不可变对象

React元素是不可变的。创建元素后,就无法更改其子级或属性。

因此,它不仅应该更改(上面的代码示例中的)“ Just Time Part”,还应该更改整个React
Element。我无法理解React如何在Immutable对象(上面的例子中是元素)中进行必要的更新,或者我缺少什么?


问题答案:

React组件是在内部使用createElement构建的:

React.createElement(type, props)

因此,当在其道具上进行任何更改时,值将被更新,但其类型不会被更新。

例如:

React.createElement('h1', 'Hello, world!')
// first param is type, and second is prop

这里的道具没有改变,因此这个元素将不会被更新。

该组件可以用createElement编写,例如:

React.createElement('div',
   React.createElement('h1', 'Hello world!'),
   React.createElement(....),
   React.createElement(...)
)

因此,只要特定元素的任何道具发生变化,该元素就只会被更新。

为什么只更新道具,而不输入类型。元件?

这是因为React将它们存储在ReactDOM对象中,而不是HTML
DOM中。并仔细分析需要更新的内容。ReactDOM只是一个具有key:value对的对象。

例如,React初始化它的dom就像:

var ReactDOM = {}

现在,无论需要更新哪个属性,都可以对其进行处理。

Object.defineProperties(ReactDOM, {
  type: { // creating immutable property
    value: 'h1',
    writable: false,
    configurable: false
  },
  props: {
    writable: true,
    value: 'MY PROPS'
  }
});
Object.seal(ReactDOM)

现在,props可以更改,但不能更改type

ReactDOM.props = 'will be updated'
ReactDOM.type = 'will not be updated'
console.log(ReactDOM.type) // 'h1'
console.log(ReactDOM.props) // 'will be updated'

我希望这可以弄清React的元素是不可变的。



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

  • 因此,我试图用几个HTML输入创建一个动态表单。我有一个对象数组,其中包含应该呈现的的。目前,我能够呈现两个输入,如文本区域,但我如何处理收音机,复选框,选择连同他们的选项?任何帮助都将不胜感激。 请参见此CodeSandBox。

  • 我在一个应用程序的前端原型上工作,该应用程序具有给定的JS、React和CoreUI4 React技术栈。我来自Python背景,在网络开发和我给定的技术堆栈方面没有太多经验。当我不得不开始使用钩子时,这一点变得很明显。 问题 我真的不明白为什么它不更新我的和/或不渲染。我需要一个条件渲染,我也使用。 我试图: 从我的主应用程序中传递一个更大的状态,一旦我启动条件逻辑(挂钩规则)就无法工作。 当我

  • 我想调用ReactJS HOC来包装JSX周围的工具提示。 呼叫应能如下所示: 因此,我创建了此函数: 电话: 它说: 函数作为React子函数无效。如果返回组件而不是从渲染返回组件,可能会发生这种情况。或者你想调用这个函数而不是返回它 如何解决?

  • 我写了一些代码来呈现ReactJS中的重复元素,但我讨厌它有多丑。 有没有更好的方法来实现这一点? (我想在模板代码或类似的方法中嵌入循环。)

  • 有一个案例我很困惑。 我有一个对象redux状态:{show:true,creative:{name:'a',tags:[t1,t2,t3]}。此对象已通过“react redux”的“connect”功能映射到道具。 当我改变属性“显示”或“creative.name”时,它确实会触发重新渲染。但是如果我将t0追加到"creative.tags",它就不会运行re-渲染。 我必须分配一个新变量来

  • 问题内容: 我已经写了一些代码来渲染ReactJS中的重复元素,但是我讨厌它是如此丑陋。 有没有更好的方法来实现这一目标? (我想在模板代码或类似方法中嵌入循环。) 问题答案: 您可以将表达式放在大括号内。请注意,在已编译的JavaScript中,为什么在JSX语法中永远不可能发生循环;JSX相当于函数调用和加糖的函数参数。仅允许使用表达式。 (此外:请记住将属性添加到在循环内渲染的组件。) JS