我正在构建一个PhotoViewer,当用户按下左键或右键时,它可以更改照片.我正在使用React、Redux、React router和React router Redux.当用户按下左键或右键时,我会做两件事,使用this.context.replace()更新url,并发送一个操作来更新当前查看的照片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 lifecycle方法.

编辑:如果您只需要在shouldComponentUpdate生命周期方法中进行肤浅的比较,您还可以考虑扩展React.PureComponent而不是React.Component.更多信息here.

Reactjs相关问答推荐

可选链和useState挂钩

通过单击具有此值的按钮将值添加到数组对象键

如何通过回调函数获取多个值?

基本react 应用程序正在触发两次Use Effect

在React中使用映射创建flex组件

如何垂直对齐 React Bootstrap Table 行中的项目

如何在 React Native 中渲染下面的对象数组?

我可以同时使用 Gatsby 和 NEXT.JS 吗?

无法通过react 路由中的链接传递信息

从ReactDataGridtry 将数据传递给父组件

无法访问 usefocusEffect 中 const 的更新状态

在react 中从外部 api 渲染列表

为什么 setState 在 React 中不是异步的?

为什么接受 useState 返回的函数的 setter 在使用 React 的单个调用中执行两次?

单击按钮或文本从一个组件移动到另一个组件

添加 React/Redux 组件模板的 VS Code 扩展

父状态改变后子组件丢失状态

需要帮助在 document.queryselector 的 nextjs 页面上插入 useEffect 状态

如何在 Reactjs 中判断受保护路由上的用户角色?

当页面重新加载react 路由导航到第一页 v6