当前位置: 首页 > 知识库问答 >
问题:

为什么在react.js中会被多次调用

陈宜修
2023-03-14

我读组件didMount在初始渲染时只被调用一次,但我看到它被渲染了多次。

似乎我创建了一个递归循环。

  • 组件didMount调度动作来获取数据
  • 一旦接收到数据,它就会触发成功操作,将数据存储在redux状态。
  • 父反应组件连接到redux存储,并且具有mapStateToProps用于刚刚在上述步骤中更改的条目
  • 父渲染子组件(通过变量编程选择)
  • 子组件的组件didMount再次被调用
  • 它消除了获取数据的操作

我想这就是正在发生的事情。我可能错了。

我怎样才能停止循环?

下面是以编程方式呈现子组件的代码

 function renderSubviews({viewConfigs, viewConfig, getSubviewData}) {

   return viewConfig.subviewConfigs.map((subviewConfig, index) => {
     let Subview = viewConfigRegistry[subviewConfig.constructor.configName]
     let subviewData = getSubviewData(subviewConfig)

     const key = shortid.generate()
     const subviewLayout = Object.assign({}, subviewConfig.layout, {key: key})
     return (
       <div
         key={key}
         data-grid={subviewLayout}
         >
         <Subview
           {...subviewData}
           />
       </div>
     )
   })
 }

共有1个答案

祁建业
2023-03-14

组件实例将只装载一次,删除时将卸载。在您的情况下,它会被删除并重新创建。

keyprop的目的是帮助React查找相同组件的前一个版本。这样,它可以用新的道具更新以前的组件,而不是创建新的道具。

React通常可以在没有键的情况下正常工作,但包含项的列表除外。它希望在那里有一个键,以便在项目被重新排列、创建或删除时能够跟踪。

在您的案例中,您明确地告诉React您的组件与前一个组件不同。你给每个渲染一个新的键。这将迫使React将前一个实例视为已删除。该组件的任何子级也将被卸载和拆除。

你应该做的是不要随意生成密钥。键应该始终基于组件正在显示的数据的标识。如果不是列表项,您可能不需要密钥。如果它是一个列表项,最好使用从数据标识派生的键,如ID属性,或者多个字段的组合。

如果生成一个随机密钥是正确的做法,那么React将为您解决这个问题。

您应该将初始获取代码放在React树的根目录中,通常是App。不要把它放在某个随机的孩子身上。至少你应该把它放在一个在你的应用生命周期内存在的组件中。

将它放在componentDidMount中的主要原因是它不会在服务器上运行,因为服务器端组件永远不会装入。这对于通用渲染非常重要。即使你现在不这样做,你也可能以后再这样做,为此做好准备是最好的做法。

 类似资料:
  • 问题内容: 关于的简单代码。是SessionScoped Bean,是RequestScoped Bean 内 我的问题是被叫很多。会告诉我们该方法在什么阶段被调用。首次加载页面时,请在阶段6-进行约 5次 呼叫。该页面上有一个,因此我在其中键入一些内容,然后单击(命令按钮)。然后在阶段1-> 4期间再呼叫 12次 。每个阶段调用此方法 3-4次 。然后,此属性的get 方法的setter方法(即

  • 编辑:由于代码剪贴不会重现错误-这里有一个指向github repo的链接:(代码远未完成) https://github.com/altruios/clicker-game 我现在已经在两台计算机上运行了它——这两台计算机都有相同的行为,而代码剪报并没有显示出来。 因此,我正在构建一个clicker游戏来学习react,我不明白为什么这段代码会以这种方式运行: 在主应用程序中,我有以下功能: 那

  • 问题内容: ,它在它的第一个版本,也有类似的代码如下: 通过使用惰性过滤器集合,它可以过滤满足给定谓词的前5个元素(在这种情况下,可以被3整除),而不必求值数组中的 每个 元素。 但是,答案随后表明,每个元素可以多次调用’谓词(对于范围为1 … 15的元素,其谓词为3次,结果为0,则为两次)。 懒惰评估此过滤器效率低下的原因是什么?有什么方法可以避免多次评估同一元素? 问题答案: 问题所在 这里的

  • 问题内容: 我正在使用Swift开发iOS通用应用程序,使用自动布局功能,并且仅支持纵向模式。 我发现打过多次。而是在启动MyApp时仅被调用一次。 为什么要多次调用?是否会按顺序对每个(,等)进行约束? 任何信息将不胜感激。 问题答案: 仅被调用一次:需要加载视图时。 ,但是,每个运行循环都会在已存在或已对其调用的任何视图上调用一次- 这包括每当将子视图添加到视图,滚动,调整大小等时。

  • 下面的程序迭代一个字符串。迭代器将其在空格之间剪切,并返回每个单词。我使用for each循环来使用iterable字符串,在该循环中,我使用与外部循环中相同的迭代器对同一字符串再次迭代。输出是:hello 0 hello 2等。。。 但它应该是:你好0你好2。。。因为外部循环已经增加了迭代器的计数器。所以我想我在这张图片中遗漏了一些关于迭代器工作的东西。。。感谢您的帮助! 代码: