为什么 componentDidMount 在 react.js 和 redux 中被多次调用?

新手上路,请多包涵

我读过 componentDidMount 仅被调用一次以进行初始渲染,但我看到它被多次渲染。

看来我创建了一个递归循环。

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

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

如何停止循环?

这是以编程方式呈现子组件的代码。

  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>
     )
   })
 }

原文由 eugene 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 920
1 个回答

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

key 的重点是帮助 React 找到相同组件的先前版本。这样它就可以用新的道具更新以前的组件,而不是创建一个新的。

React 通常可以在没有键的情况下正常工作,但包含项目的列表除外。它需要一个密钥,以便它可以跟踪项目何时重新排列、创建或删除。

在您的情况下,您明确告诉 React 您的组件与前一个组件不同。您在每次渲染时都提供了一个新键。这会强制 React 将前一个实例视为已被删除。该组件的所有子组件也将被卸载和拆除。

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

如果生成随机密钥是正确的做法,那么 React 会为您处理好这件事。

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

将它放入 componentDidMount 的主要原因是它不能在服务器上运行,因为服务器端组件永远不会被挂载。这对于通用渲染很重要。即使您现在不这样做,您也可以稍后再这样做,并且为此做好准备是最佳实践。

原文由 DDS 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进