Skip to content

Commit c613fbb

Browse files
committed
perf(Route Viewer): make RouteRow a PureComponent to reduce unneeded re-renders
1 parent 26b9a8a commit c613fbb

File tree

1 file changed

+20
-16
lines changed

1 file changed

+20
-16
lines changed

lib/components/viewers/route-viewer.js

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { Component } from 'react'
1+
import React, { Component, PureComponent } from 'react'
22
import PropTypes from 'prop-types'
33
import { Label, Button } from 'react-bootstrap'
44
import { VelocityTransitionGroup } from 'velocity-react'
@@ -40,7 +40,15 @@ class RouteViewer extends Component {
4040
}
4141

4242
render () {
43-
const { operators, routes, hideBackButton, languageConfig } = this.props
43+
const {
44+
findRoute,
45+
hideBackButton,
46+
languageConfig,
47+
operators,
48+
routes,
49+
setViewedRoute,
50+
viewedRoute
51+
} = this.props
4452
const sortedRoutes = routes ? Object.values(routes).sort(routeComparator) : []
4553
const agencySortedRoutes = operators.length > 0
4654
? sortedRoutes.sort((a, b) => {
@@ -78,10 +86,13 @@ class RouteViewer extends Component {
7886
const operator = operatorForRoute(operators, route) || {}
7987
return (
8088
<RouteRow
89+
findRoute={findRoute}
90+
isActive={viewedRoute && viewedRoute.routeId === route.id}
8191
key={route.id}
8292
operator={operator}
8393
route={route}
84-
{...this.props} />
94+
setViewedRoute={setViewedRoute}
95+
/>
8596
)
8697
})
8798
}
@@ -91,15 +102,10 @@ class RouteViewer extends Component {
91102
}
92103
}
93104

94-
class RouteRow extends Component {
95-
isActiveRoute = () => {
96-
const { route, viewedRoute } = this.props
97-
return viewedRoute && viewedRoute.routeId === route.id
98-
}
99-
105+
class RouteRow extends PureComponent {
100106
_onClick = () => {
101-
const { route, findRoute, setViewedRoute } = this.props
102-
if (this.isActiveRoute()) {
107+
const { findRoute, isActive, route, setViewedRoute } = this.props
108+
if (isActive) {
103109
// Deselect current route if active.
104110
setViewedRoute({ routeId: null })
105111
} else {
@@ -110,10 +116,8 @@ class RouteRow extends Component {
110116
}
111117

112118
render () {
113-
const { operator, route, routes, viewedRoute } = this.props
114-
const isActive = this.isActiveRoute()
119+
const {isActive, route, operator} = this.props
115120
const {defaultRouteColor, defaultRouteTextColor, longNameSplitter} = operator
116-
const activeRouteData = isActive ? routes[viewedRoute.routeId] : null
117121
const color = `#${defaultRouteTextColor || route.textColor || '000000'}`
118122
const backgroundColor = `#${defaultRouteColor || route.color || 'ffffff'}`
119123
const longName = (longNameSplitter && route.longName && route.longName.split(longNameSplitter).length > 1)
@@ -146,8 +150,8 @@ class RouteRow extends Component {
146150
<VelocityTransitionGroup enter={{animation: 'slideDown'}} leave={{animation: 'slideUp'}}>
147151
{isActive && (
148152
<div style={{ padding: 8 }}>
149-
{activeRouteData.url
150-
? <a href={activeRouteData.url} target='_blank'>Route Details</a>
153+
{route.url
154+
? <a href={route.url} target='_blank'>Route Details</a>
151155
: 'No route URL provided.'
152156
}
153157
</div>

0 commit comments

Comments
 (0)