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

推送新URL时,多次调用React组件渲染

闻人越
2023-03-14
问题内容

我正在构建一个PhotoViewer,当用户向左或向右按​​下时可以更改照片。我正在使用React,Redux,react-router和react-
router-
redux。当用户按下向左或向右this.context.replace()按钮时,我会做两件事,我使用来更新网址,并调度一个操作来更新当前查看的照片this.props.dispatch(setPhoto(photoId))。我正在订阅状态更改以进行调试。

以上每一行都会触发新的状态更改。因为我更新了currentlyViewedPhoto,所以分派操作会更新存储,而更新URL会更新存储,因为react-
router-
redux会更新存储中的URL。当我分派动作时,在第一个重新呈现周期中,组件的render函数调用两次。在第二个重新渲染周期中,组件的render函数被调用一次。这正常吗?以下是相关代码:

class PhotoViewer extends Component {
  pressLeftOrRightKey(e) {
    ... code to detect that left or right arrow was pressed ...

    // Dispatching the action triggers a state update
    // render is called once after the following line
    this.props.dispatch(setPhoto(photoId)) // assume photoId is correct

    // Changing the url triggers a state update
    // render is called twice
    this.context.router.replace(url) // assume url is correct
    return
  }

  render() {
    return (
      <div>Test</div>
    )
  }
}

function select(state) {
  return state
}

export default connect(select)(PhotoViewer)

渲染被称为三次正常吗?这似乎有些大材小用,因为React必须将DOM进行三遍比较。我猜这并不重要,因为什么都没有改变。我是这个工具集的新手,所以随时可以问这个问题。


问题答案:

我认为这是正常的。如果您没有明显的性能问题,那我就不为所动。如果性能开始成为问题,shouldComponentUpdate如果可以确定某些状态更改不会更改渲染的组件,则可以考虑重写生命周期方法。

编辑:您也可以考虑扩展,React.PureComponent而不是React.Component只在shouldComponentUpdate生命周期方法中需要进行浅层比较。更多信息在这里。



 类似资料:
  • 我正在构建一个PhotoViewer,当用户按左键或右键时,它可以更改照片。我正在使用React、Redux、React router和React router Redux。当用户按下左键或右键时,我会做两件事,使用并发送一个操作来更新当前查看的照片,。我订阅状态更改以进行调试。 上面的每一行都会触发一个新的状态更改。因为我更新了,所以发送操作会更新存储,而更新url会更新存储,因为react r

  • 问题内容: 我第一次尝试使用React钩子,直到我意识到当我获取数据并更新两个不同的状态变量(数据和加载标志)时,我的组件(数据表)都呈现了两次,即使两次调用都看起来不错状态更新程序发生在同一功能中。这是我的api函数,它将两个变量都返回给我的组件。 在普通的类组件中,您只需要调用一次即可更新状态,该状态可以是一个复杂的对象,但是“钩子方式”似乎是将状态分成较小的单元,其副作用似乎是多次分别更新时

  • 问题内容: 我正在尝试将表示性组件与容器组件分开。我有一个和一个。容器负责触发redux操作,以根据当前用户获取适当的网站。 问题是在最初呈现容器组件之后,异步获取了当前用户。这意味着容器组件不知道它需要重新执行其函数中的代码,该代码将更新数据以发送到。我认为我需要在其props(user)之一更改时重新渲染容器组件。如何正确执行此操作? 问题答案: 您必须在方法中添加条件。 该示例用于比较对象。

  • 我试图建立一个连接4的游戏,它有一个由7列组件组成的板组件,所有包含6个空间组件。每个列的上方都有一个拖放按钮,该按钮将用于将该件拖放到列中。为了在“红色”和“黑色”玩家之间交替,我创建了一个状态“redorblue”,它返回一个布尔值。 简而言之,当单击Drop按钮时,我希望切换“redorblue”的值,以跟踪轮到谁了。我已经将onClick函数设置为setState({redorblue:!

  • 我试图将表示组件与容器组件分开。我有一个和一个。容器负责触发redux操作,以基于当前用户获取适当的站点。 问题在于,在容器组件最初呈现之后,当前用户是异步获取的。这意味着容器组件不知道需要在其函数中重新执行代码,该函数将更新数据以发送到。我想当容器组件的一个道具(用户)发生变化时,我需要重新渲染它。如何正确地执行此操作?

  • 我对react还比较陌生,我一直在分解一个web应用程序,并用react组件替换部分。我现在正在开发一个组件,其中包含我创建的几个不同组件。 在新组件中,我在componentDidMount函数中进行API调用,并创建子组件。乍一看,一切看起来都很完美,但当我们在其中一个子组件中进行状态更改,然后在父组件中进行更改时,子组件将其状态重置为更改之前的状态。 我知道发生了什么,州政府没有被传递给家长