我认为应该设置侦听器的普遍智慧是componentDidMount
因为它可以防止同构应用程序中出现问题。我认为,在非同构应用程序在任何设置下听众的病例98%componentWillMount
和componentDidMount
将同样的方式工作,但它在概念上的错误,在情况下(如在原来的问题给出的例子)的2%,它会做错的东西。
React 源代码中有 git 问题讨论和评论表明最好componentWillMount
根本不在服务器上调用,但如果不是,则在比较服务器预渲染和客户端的校验和测试中会产生问题初始渲染。在componentWillMount
服务器上意味着在这种情况下它不会作为组件生命周期的一部分执行,但这被用作在任何情况下都不将其视为生命周期一部分的借口。
事实上,componentWillMount
如果您不是在创建同构应用程序,那么这正是注册侦听器的正确位置。如果您正在创建同构应用程序,那么您必须做出一些妥协,因为在这种情况下校验和/生命周期问题并不理想(也许只是测试服务器环境,然后不注册侦听器?)。
在非同构应用程序中,componentWillMount
在某些情况下添加侦听器可以节省不必要的重新渲染,并将按文档顺序注册它们。文档顺序的优点是,如果您有办法在重新渲染组件时刷新挂起的事件(例如,takeRecords
在 a 上MutationObserver
),那么您可以确保文档自上而下而不是自下而上重新渲染,从而转换渲染复杂性从多项式到线性。
此外,在初始渲染和注册侦听器之间没有危险期,其中 Store 可以更改而不触发渲染,导致视图与 Store 不同步(原始问题中给出的示例问题)。如果侦听器已注册,componentDidMount
您要么需要确保 StorecomponentDidMount
在子代调用中未更改,要么在注册侦听器后强制重新渲染/重新同步,如果完成,componentDidMount
则以相反的文档顺序完成可能是多项式复杂度(取决于 ReactsetStates
的聚合方式/是否聚合)。